EF4.1(代码优先) – 如何指定复合关系

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

public class Equipment_CableNormalised { ... [Association(ThisKey = "EquipmentId,PortNumber", OtherKey = "EquipmentId,PortNumber", IsForeignKey = false)] public List EquipmentPorts { get; set; } } 

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

我可以在EF4.1中使用相同的东西(使用注释或流畅的api)吗? 我知道你可以指定复合键并使用[Keys]和[ForeignKeys]属性,但这种关系不会映射到键…

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

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

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

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

要么使用HasKey,请将其放在OnModelCreating上

  modelBuilder.Entity().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。

这可能是作为外键的答案复合键

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