我有一个现有的数据库,并且使用实体框架4.1的“数据库优先”方法。不幸的是,数据库正在使用一些传统的命名约定,以便具有主键的列经常使用各种名称,如“occID”。后来在验证过程中,EntityFramework在验证实体模型时会抛出一个异常:如何避免在使用DB-first方法时将[注解]注释添加到实体
System.Data.Edm.EdmEntityType :: EntityType'占用'没有定义键。定义此EntityType的关键字。
这个实体有一个唯一的键(它也在Edmx模型中标记为EntityKey),但模型验证器不断抱怨。我找到的唯一解决方案是使用数据注释[Key]在生成的DbContext类中签署属性,以便EF知道哪个属性是关键字。
还有其他方法可以做到吗?我想EF正在检查一些编码约定来识别哪个属性是一个关键字。由于这不是以代码优先的方式,所以我不允许手动更改生成的代码,因为每次更改模型中的某些内容时,更改都会丢失。
这是EDMX文件的相应部分:
<EntityType Name="occupancy">
<Key>
<PropertyRef Name="occID" />
</Key>
<Property Name="occID" Type="int" Nullable="false"
StoreGeneratedPattern="Identity" />
<Property Name="occPDM" Type="int" />
<Property Name="occDatePDM" Type="datetime" />
<Property Name="occDatePC" Type="datetime" />
<Property Name="occOccupancy" Type="int" />
<Property Name="occSityControlID" Type="bigint"
/>
<Property Name="occSityControlLine" Type="int"
/>
<Property Name="occPDM_Id" Type="bigint" />
<Property Name="occServiceCar" Type="int" />
<Property Name="occMoneyCar" Type="int" />
<Property Name="occPdmParentId" Type="int" />
</EntityType>
是的,我希望如此。看到我更新的问题。 – 2011-05-04 14:51:17
主键看起来不错。这是未经编辑的edmx吗? – 2011-05-04 14:55:57
是的。但是,我必须说我改变了模型中实体的名称以使用大写的第一个字符:“占用”。所以相应的自动生成的类被称为“占用”,但数据库表仍称为“占用”。也许这可能是问题......?我更改了实体集名称以及实体名称。 – 2011-05-04 14:59:02