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

本文关键字:何指定 复合 关系 代码 EF4 | 更新日期: 2023-09-27 18:01:38

在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]属性,但这种关系不能映射到键…

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

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

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

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

使用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属性放在子类本身,可能需要把列顺序也。

这可以是应答组合键作为外键

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