I'm struggling connecting two really simple tables:
[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; }
}
There are two Foreign Keys in LinkedItem
table:
itemId
, points to the table Item
to show itself
parentItemId
, points to the table Item
to show its parent
I would like to accomplish something like this:
[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; }
}
I was successful with creating connection from Item to LinkedItem:
modelBuilder.Entity<Item>().HasOptional(i => i.LinkedItem).WithRequired(i => i.Item);
but I can't add another connection. Can you help me with Fluent API configuration for these two tables?
A LinkedItem class isn't necessary for this. You can simply accomplish this with one class.
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);
Otherwise simply add:
modelBuilder.Entity<Item>()
.HasMany(entity => entity.ChildItems)
.WithRequired(entity => entity.ParentItem)
.HasForeignKey(entity => entity.ParentItemId);
EDIT: extended answer.
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; }
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.