繁体   English   中英

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

[英]EF4.1 (code first) - How to specify a composite relationship

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

public class Equipment_CableNormalised
{
    ...

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

}

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

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

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

Code first 只允许映射到键。 如果你有现有的数据库,你可以在你的 model 和 map 新关系中作弊,就像你在 map 存在的方式一样,但你仍然必须遵循简单的规则,因为外键中的属性是映射的主要属性是从属实体.

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

使用 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)方法,也许你可以在子 class 本身上放置两个 ForeignKey 属性,可能也需要放置 Column Order 。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM