【问题标题】:Entity Framework - Table Per Type Inheritance - Existing Database实体框架 - 按类型继承的表 - 现有数据库
【发布时间】:2010-10-08 13:49:40
【问题描述】:
我想使用实体框架为现有数据库实现 Table Per Type 继承。
数据库:
ImageParagraphs 的继承工作完美,但由于主键不同(ParagraphID;ParagraphID+LinkID),我无法使用 LinkListParagraph 进行 Table Per Type 继承:
错误 1 错误 3003:从第 113 行开始映射片段时出现问题:EntitySet 段落的所有关键属性(Paragraphs.ParagraphID)必须映射到表 LinkListParagraph 的所有关键属性(LinkListParagraph.LinkID、LinkListParagraph.ParagraphID) .
C:\Users\buc\Documents\Visual Studio 2008\Projects\ParagraphTest\ParagraphTest\ParagraphModel.edmx 114 15 ParagraphTest
是否有可能在不更改数据库的情况下解决此问题?
我想做的是这样的:
【问题讨论】:
标签:
.net
entity-framework
inheritance
orm
【解决方案1】:
一种方法可能是就主键向实体框架撒谎。这将需要进入 EDMX 中的存储映射并更改主键标志。但是请注意,如果您这样做,那么从数据库更新模型向导将在您每次进行更新时尝试“修复”您的映射。
另一种方法是在数据库中创建视图并映射视图而不是表。
【解决方案2】:
主要问题来自实体框架不必要的默认键创建。
尝试以 xml 格式打开 .edmx 文件,您现在将看到以下类似内容:
<EntityType Name="GSKItemDetails">
<Key>
<PropertyRef Name="ItemId" />
<!--<PropertyRef Name="Description" />
<PropertyRef Name="NDCNumber" />-->
</Key>
<Property Name="ItemId" Type="varchar" Nullable="false" MaxLength="47" />
<Property Name="Description" Type="varchar" Nullable="false" MaxLength="30" />
<Property Name="NDCNumber" Type="varchar" Nullable="false" MaxLength="16" />
<Property Name="UnitPrice" Type="decimal" Precision="19" Scale="4" />
</EntityType>
在我的例子中,如上所述,注释掉不必要的 PropertyRefs,解决了给出错误的问题:错误 3003。