gpt4 book ai didi

entity-framework-4.1 - Entity Framework 4.1 Database First 未向 DbContext T4 生成的类添加主键

转载 作者:行者123 更新时间:2023-12-04 08:21:36 25 4
gpt4 key购买 nike

我刚刚开始使用 Entity Framework 4.1,尝试“数据库优先”模式。当 EF 用“ADO.Net DbContext Generator”生成一个 Model 类时,难道它不应该用 [Key] 属性标识类的主键吗?没有这个,它似乎与 T4 MVCScaffolding 不兼容。

以下是详细信息:

使用实体数据模型设计器 GUI,我从现有数据库向模型添加了一个简单的“国家/地区”表。 GUI 正确地将名为“PK”的单个整数标识键字段标识为我的主键。 (唉!我是新用户,所以我无法添加屏幕截图。我在下面添加了 CSDL。)但是,当 EF 使用“ADO.Net DbContext Generator”生成代码时,它不会识别 PK field 作为生成的类中的关键字段(参见下面的代码摘录)。

“国家/地区”表的 CSDL:

<edmx:ConceptualModels>
<Schema Namespace="EpiDataModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
<EntityContainer Name="EpiModelEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="countries" EntityType="EpiDataModel.country" />
</EntityContainer>
<EntityType Name="country">
<Key>
<PropertyRef Name="PK" />
</Key>
<Property Name="PK" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="Abbreviation" Type="String" Nullable="false" MaxLength="200" Unicode="false" FixedLength="false" />
<Property Name="Name" Type="String" MaxLength="1024" Unicode="false" FixedLength="false" />
<Property Name="Description" Type="String" MaxLength="1024" Unicode="false" FixedLength="false" />
<Property Name="Sequence" Type="Int32" />
</EntityType>
</Schema>
</edmx:ConceptualModels>

这是自动生成的代码:

//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Collections.Generic;

namespace MvcApplication1.Areas.Epi.Models
{
public partial class country
{
public int PK { get; set; }
public string Abbreviation { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Nullable<int> Sequence { get; set; }
}
}

当我尝试使用 MVCScaffolding T4 模板搭建 Controller 时,这会导致问题。我收到错误消息“没有属性似乎是主键。” NuGet 包管理器控制台的命令和输出如下:
PM> scaffold controller MvcApplication1.Areas.Epi.Models.country -Area Epi -NoChildItems -DbContextType MvcApplication1.Areas.Epi.Models.EpiModelEntities -Force
Scaffolding countriesController...
Get-PrimaryKey : Cannot find primary key property for type 'MvcApplication1.Areas.Epi.Models.country'. No properties appear to be primary keys.
At C:\work\EPI\EPIC_MVC3\sandbox\MvcApplication1\packages\MvcScaffolding.1.0.6\tools\Controller\MvcScaffolding.Controller.ps1:74 char:29
+ $primaryKey = Get-PrimaryKey <<<< $foundModelType.FullName -Project $Project -ErrorIfNotFound
+ CategoryInfo : NotSpecified: (:) [Get-PrimaryKey], Exception
+ FullyQualifiedErrorId : T4Scaffolding.Cmdlets.GetPrimaryKeyCmdlet

但是,如果我手动更改生成的类以向字段添加 [Key] 属性,那么上面显示的完全相同的脚手架命令可以正常工作:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; // manually added

namespace MvcApplication1.Areas.Epi.Models
{
public partial class country
{
[Key] // manually added
public int PK { get; set; }
public string Abbreviation { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public Nullable<int> Sequence { get; set; }
}
}

那么为什么 EF Database First 和 T4 MVCScaffolding 不能很好地结合在一起呢?即使没有脚手架问题,EF 类也不需要知道关键字段是什么吗?

最佳答案

T4 模板不使用数据注释,因为从模板生成的类不需要它们。 EF 也不需要它们,因为映射是在 XML 文件中而不是在代码中定义的。如果您需要数据注释,您必须:

  • 修改 T4 模板以使用它们(这需要了解 EF 元数据模型)
  • 不要使用模板,而是先使用代码
  • 使用 buddy classes手动添加数据注释并希望脚手架能够识别它们
  • 关于entity-framework-4.1 - Entity Framework 4.1 Database First 未向 DbContext T4 生成的类添加主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420256/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com