2011-05-04 65 views
0

我有一个现有的数据库,并且使用实体框架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> 

回答

0

那么,我通过删除所有生成的类并在开始时完全生成它们来解决此问题。现在实体模型包含相应的键,我不需要手动修改模型。

0

你肯定有在EDMX该实体设置主键?如果不检查数据库以确保在那里正确设置了一个。

+0

是的,我希望如此。看到我更新的问题。 – 2011-05-04 14:51:17

+0

主键看起来不错。这是未经编辑的edmx吗? – 2011-05-04 14:55:57

+0

是的。但是,我必须说我改变了模型中实体的名称以使用大写的第一个字符:“占用”。所以相应的自动生成的类被称为“占用”,但数据库表仍称为“占用”。也许这可能是问题......?我更改了实体集名称以及实体名称。 – 2011-05-04 14:59:02