.net 定义实体框架1:1关联
我试图在实体框架模型中定义两个实体之间的1:1关联(一个映射到表,另一个映射到视图-使用DefinedQuery)。 当试图在设计器中为此定义映射时,它会让我选择要将关联映射到的(1)表或视图。我应该选择什么?我可以选择这两个表中的任何一个,但是我必须为关系的每一端从该表(或视图)中选择一列。我希望能够从一个表中为关联的一端选择一列,从另一个表中为关联的另一端选择一列,但是没有办法做到这一点 在这里,我选择映射到“DW_WF_ClaimInfo”视图,这迫使我从该视图中选择两列—关系的每一端一列 我还尝试在XML中手动定义映射,如下所示:.net 定义实体框架1:1关联,.net,visual-studio,entity-framework,ado.net,.net,Visual Studio,Entity Framework,Ado.net,我试图在实体框架模型中定义两个实体之间的1:1关联(一个映射到表,另一个映射到视图-使用DefinedQuery)。 当试图在设计器中为此定义映射时,它会让我选择要将关联映射到的(1)表或视图。我应该选择什么?我可以选择这两个表中的任何一个,但是我必须为关系的每一端从该表(或视图)中选择一列。我希望能够从一个表中为关联的一端选择一列,从另一个表中为关联的另一端选择一列,但是没有办法做到这一点 在这里,我选择映射到“DW_WF_ClaimInfo”视图,这迫使我从该视图中选择两列—关系的每一端一列
<AssociationSetMapping Name="Entity1Entity2" TypeName="ClaimsModel.Entity1Entity2"
StoreEntitySet="Entity1">
<EndProperty Name="Entity2">
<ScalarProperty Name="DOCUMENT" ColumnName="DOCUMENT" />
</EndProperty>
<EndProperty Name="Entity1">
<ScalarProperty Name="PK_DocumentId" ColumnName="PK_DocumentId" />
</EndProperty>
</AssociationSetMapping>
但这给了:
错误2010:MetadataWorkspace中不存在作为此MSL一部分指定的列“DOCUMENT”。
似乎它仍然希望两列来自同一个表,这对我来说没有意义
此外,如果我为每一端选择相同的键,例如:
<AssociationSetMapping Name="Entity1Entity2" TypeName="ClaimsModel.Entity1Entity2"
StoreEntitySet="Entity1">
<EndProperty Name="Entity2">
<ScalarProperty Name="DOCUMENT" ColumnName="PK_DocumentId" />
</EndProperty>
<EndProperty Name="Entity1">
<ScalarProperty Name="PK_DocumentId" ColumnName="PK_DocumentId" />
</EndProperty>
</AssociationSetMapping>
然后我得到:
Error 3021: Problem in Mapping Fragment starting at line 675: Each of the following
columns in table AssignedClaims is mapped to multiple conceptual side properties:
AssignedClaims.PK_DocumentId is mapped to
<AssignedClaimDW_WF_ClaimInfo.DW_WF_ClaimInfo.DOCUMENT,
AssignedClaimDW_WF_ClaimInfo.AssignedClaim.PK_DocumentId>
错误3021:映射从第675行开始的片段时出现问题:以下各项
表AssignedClaims中的列映射到多个概念侧属性:
AssignedClaims.PK_DocumentId映射到
我没有得到什么?您必须选择包含外键的表。下一步是从实体中删除该外键,因为它已使用您刚才创建的关系表示 例如:
table A
-------
A_ID int
B_ID int
table B
-------
B_ID int
在本例中,您将在设计器中选择表A,因为它包含外键。此外,您还需要从A实体中删除B_ID。不是舒尔提供答案,而是使用实体框架,我总是在每个表中创建一个主键(即使我不需要它)。例如:
- 表Customer将CustumerID作为主键
- 表Product将ProductID作为主键
- 表顺序当然使用CustomerID+ProductID作为主键。我还创建了一个本地主键:OrderID
variable_A = tableAs.A_ID
variable_B = tableAs.tableBs.B_ID
第二个赋值是使用实体中定义的关联来获取数据。表A中没有名为“B_ID”的属性
这是所有假设我理解正确:)。至少现在对我来说是正确的
:-Dan首先在数据库中创建一个外键,然后从数据库中创建关联或更新模型。在实体框架中,概念设计中应该没有外键。我认为这在EF4中是允许的(经过一些调整),但在EF3.5中,这是不可能的 要解决此问题,只需删除EF设计器中表示外键的所有属性。不要删除主键
如果随后出现“关联端未映射…”错误,请参阅(我的答案)。当我尝试在主键上连接的两个表之间执行一对一操作时,收到了相同的错误。(不,我没有设计数据库)。因此,删除FK的解决方案不起作用-FK也是PK,因此您不打算删除它。作为实验,我将关联的一侧更改为0..1,瞧,模型编译时没有错误。我在使用EF3.5时,简单地说,我做了以下几点:
在XAML元数据代码中,具有PK的父实体将显示子视图实体,该实体可以关联到绑定项。在花了一整天的时间研究这个问题后,我终于找到了答案!事实上,我发现了两种不同的方法来解决这个问题,假设我遇到了克雷格遇到的同样问题 首先,driAn的回答没有真正的帮助(如果Craig和我有相同的问题,请再说一遍),因为问题是表A中没有单独的外键。表A的主键与表B的主键完全相同!具体来说,我使用的是一个视图和一个表,而不是两个表:
table A
-------
A_ID int
col1 int
col2 int
view A_extra
-------
A_ID int
col3 int
因此,以下是我找到的解决方案:
1。映射到两个不同的实体,但使用hack。因此,driAn的答案的整个问题是,我们没有单独的外键列来映射,然后我们可以从属性中删除它(我们不能从属性中删除它,因为它是
table A
-------
A_ID int
col1 int
col2 int
view A_extra
-------
A_ID int
A_FK_ID int
col3 int