实体框架Fluent API中的两个FK
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架Fluent API中的两个FK相关的知识,希望对你有一定的参考价值。
我正在努力连接两个非常简单的表:
[Table("Item")]
public class Item
{
[Key]
[Column("itemId", TypeName = "int")]
public int ItemId { get; set; }
}
[Table("LinkedItems")]
public class LinkedItem
{
[Key]
[Column("itemId", TypeName = "int")]
public int ItemId { get; set; }
[Column("parentItemId", TypeName = "int")]
public int ParentItemId { get; set; }
}
LinkedItem
表中有两个外键:
itemId
,指向桌子Item
展示自己parentItemId
,指向表Item
显示其父母
我想完成这样的事情:
[Table("Item")]
public class Item
{
[Key]
[Column("itemId", TypeName = "int")]
public int ItemId { get; set; }
public ICollection<LinkedItem> ChildItems { get; set; }
public LinkedItem LinkedItem { get; set; }
}
[Table("LinkedItems")]
public class LinkedItem
{
[Key]
[Column("itemId", TypeName = "int")]
public int ItemId { get; set; }
[Column("parentItemId", TypeName = "int")]
public int ParentItemId { get; set; }
public Item Item { get; set; }
public Item ParentItem { get; set; }
}
我成功创建了从Item到LinkedItem的连接:
modelBuilder.Entity<Item>().HasOptional(i => i.LinkedItem).WithRequired(i => i.Item);
但我不能添加另一个连接。你能帮我解决这两个表的Fluent API配置吗?
答案
此时不需要LinkedItem类。你可以用一个类完成这个。
public class Item
{
public int Id { get; set; }
public int ParentItemId { get; set; }
public virtual Item ParentItem { get; set; }
public virtual ICollection<Item> ChildItems { get; set; }
}
modelBuilder.Entity<Item>()
.HasRequired(entity => entity.ParentItem)
.WithMany(entity => entity.ChildItems)
.HasForeignKey(entity => entity.ParentItemId);
否则只需添加:
modelBuilder.Entity<Item>()
.HasMany(entity => entity.ChildItems)
.WithRequired(entity => entity.ParentItem)
.HasForeignKey(entity => entity.ParentItemId);
编辑:扩展答案。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Item>()
.HasOptional(entity => entity.LinkedItem)
.WithRequired(entity => entity.Item);
modelBuilder.Entity<Item>()
.HasMany(entity => entity.ChildItems)
.WithRequired(entity => entity.ParentItem)
.HasForeignKey(entity => entity.ParentItemId);
}
[Table("Item")]
public class Item
{
[Key]
public int ItemId { get; set; }
public virtual ICollection<LinkedItem> ChildItems { get; set; }
public virtual LinkedItem LinkedItem { get; set; }
}
[Table("LinkedItem")]
public class LinkedItem
{
[Key]
public int ItemId { get; set; }
public int ParentItemId { get; set; }
public virtual Item Item { get; set; }
public virtual Item ParentItem { get; set; }
}
以上是关于实体框架Fluent API中的两个FK的主要内容,如果未能解决你的问题,请参考以下文章
实体框架(CTP5、Fluent API)。重命名导航属性的列
实体框架代码优先 - Fluent Api 与数据注释的优缺点 [关闭]