【问题标题】:EF4.1 (code first) - How to specify a composite relationshipEF4.1(代码优先) - 如何指定复合关系
【发布时间】:2011-10-02 14:53:08
【问题描述】:

在 Linq to SQL 中,我可以指定不必依赖于数据库中存在的外键和 pk 的关系,这对于创建这样的复合关系很有用:

public class Equipment_CableNormalised
{
    ...

    [Association(ThisKey = "EquipmentId,PortNumber", OtherKey = "EquipmentId,PortNumber", IsForeignKey = false)]
    public List<EquipmentPort> EquipmentPorts
    {
        get; set;
    }

}

然后生成类似于" .. join EquipmentPorts EP on EP.EquipmentId = blah and EP.PortNumber = Blah"的sql。

我可以在 EF4.1 中做同样的事情(使用注释或流利的 api)吗?我知道您可以指定复合键并使用 [Keys] 和 [ForeignKeys] 属性,但这种关系不会映射到键...

【问题讨论】:

  • “关系不映射到键”是什么意思?如果它没有映射到键(PK/UK、FK),则它不是数据库关系。
  • 不是数据库关系。碰巧的是,其中一个实体实际上映射到视图,而不是表。在 L2S 中将这些实体与关联定义连接在一起是一种方便的解决方案,这使我不必编写更复杂的查询代码。所以它不是数据库中内容的“纯粹”表示

标签: c# entity-framework entity-framework-4.1 entity-relationship


【解决方案1】:

您的代码中的示例关系如何工作?我希望 EquipementId 在一侧必须是 PK 或唯一密钥(L2S 和 EF 均不支持),否则关系将不存在(一对一和一对多都需要唯一的主体)。一旦它在一侧被PK,端口号就是多余的。

代码优先只允许映射到键。如果您有现有数据库,则可以在模型中欺骗它并以与映射现有数据库相同的方式映射新关系,但您仍然必须遵循简单的规则 - 主体中的属性是主键,依赖实体中的属性被映射为外键.

如果您希望 EF 为您生成 DB,您将始终拥有数据库中的所有关系。

【讨论】:

  • 感谢您的回复。在这种情况下,我永远不想从 EF 生成数据库,它非常复杂,并且其中存储了 procs 和一些 EF 不支持的数据类型。在 L2S 中,您可以按照我的示例创建关系(关联),这些关系实际上并不映射到数据库中存在的关系。该示例的一侧是视图(因此没有键),另一侧是具有自己的“id”PK 的表。我将其视为 L2S,允许我只定义临时关系,就像您可以在 SQL 中“加入”两个实际上没有定义关系的表一样。
【解决方案2】:

使用 HasKey http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

要么使用 HasKey,把它放在 OnModelCreating 上

 modelBuilder.Entity<SalesOnEachCountry>().HasKey(x => new { x.CountryId, x.OrYear });   

或使用键列顺序

public class SalesOnEachCountry
{        
    [Key, Column(Order=0)] public int CountryId { get; set; }
    public string CountryName { get; set; }
    [Key, Column(Order=1)] public int OrYear { get; set; }
     
    public long SalesCount { get; set; }      
    public decimal TotalSales { get; set; }
}

关于你关于外键的问题,我还没有尝试过纯代码(OnModelCreating)的方法,也许你可以在子类本身上放两个 ForeignKey 属性,可能也需要放 Column Order。

这可能是答案composite key as foreign key

这个答案证实了我的预感,您可以将两个 ForeignKey 属性放在子类本身上。

【讨论】:

  • 谢谢,还没有对此感到高兴,我会尝试一个更简单的测试,看看我的进展如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多