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