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

时间:2011-07-11 08:33:15

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

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

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]属性,但此关系不会映射到键...

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

使用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属性。