.net 定义实体框架1:1关联

.net 定义实体框架1:1关联,.net,visual-studio,entity-framework,ado.net,.net,Visual Studio,Entity Framework,Ado.net,我试图在实体框架模型中定义两个实体之间的1:1关联(一个映射到表,另一个映射到视图-使用DefinedQuery)。 当试图在设计器中为此定义映射时,它会让我选择要将关联映射到的(1)表或视图。我应该选择什么?我可以选择这两个表中的任何一个,但是我必须为关系的每一端从该表(或视图)中选择一列。我希望能够从一个表中为关联的一端选择一列,从另一个表中为关联的另一端选择一列,但是没有办法做到这一点 在这里,我选择映射到“DW_WF_ClaimInfo”视图,这迫使我从该视图中选择两列—关系的每一端一列

我试图在实体框架模型中定义两个实体之间的1:1关联(一个映射到表,另一个映射到视图-使用DefinedQuery)。 当试图在设计器中为此定义映射时,它会让我选择要将关联映射到的(1)表或视图。我应该选择什么?我可以选择这两个表中的任何一个,但是我必须为关系的每一端从该表(或视图)中选择一列。我希望能够从一个表中为关联的一端选择一列,从另一个表中为关联的另一端选择一列,但是没有办法做到这一点

在这里,我选择映射到“DW_WF_ClaimInfo”视图,这迫使我从该视图中选择两列—关系的每一端一列

我还尝试在XML中手动定义映射,如下所示:

<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

我正在处理一个遗留应用程序,因此添加额外的主键不是我的选择。我要做的是将它映射为1:(0或1),而不是1:1,以使其工作。例如,如果我有两个表,分别是Customer和CustomerDetails,它们都有一个主键CustomerID。要创建关联,我必须将其设置为1个客户可以关联(0或1)个客户详细记录。每次插入客户时,请确保同时插入客户详细信息,以便保持1:1。

我同意这种设置方式似乎违反直觉。对于任何一个太慢(像我一样)得不到driAn答案的人: 根据下面的论坛帖子,我记得我们是在处理一个实体,而不是直接处理一个表。关联位于实体上(该实体可以对表进行建模,但不一定非得如此)

实体框架正在将属性关联到表列。这就是为什么我们必须删除实体上的“外键”属性(注意:我们没有删除表列)。要引用代码中的列,(使用实体对表A和表B的给定示例进行建模),您可以编写如下内容:

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时,简单地说,我做了以下几点:

  • 使用列上的主键(PK)创建表
  • 在列上创建具有外键(FK)的视图。 反之亦然
  • 在edmx图表设计器中,创建了关联
  • 编译代码

  • 在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