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]属性,但这种关系不能映射到键…
代码中的示例关系如何工作?我希望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属性放在子类本身。