我根据这里的建议code first many to many建模我的m:m表。下面是我的模型(这反映在数据库中):
public class Catalog {
...
public virtual ICollection <CatalogItem> CatalogItems {get;set;}
public virtual ICollection <CatalogSubscriber> CatalogSubscribers {get;set;}
}
public class Item {
...
public virtual ICollection <CatalogItem> CatalogItems {get;set;}
}
public class Subscriber {
...
public virtual ICollection <CatalogSubscriber> CatalogSubscribers {get;set;}
}
public class CatalogItem{
[ForeignKey("Catalog")]
public Guid Catalog_Id { get; set; }
[ForeignKey("Item")]
public Guid Item_Id { get; set; }
public virtual Catalog Catalog { get; set; }
public virtual Item Item { get; set; }
}
public class CatalogSubscriber{
//similar to catalogitem
}
我收到错误&#34;无效列Subscriber_Id&#34;当我试图获取目录时,我可以在select语句中看到,由于某种原因,它认为Subscriber_Id是Catalog中的一个列(它不是&t; t)。我试过这个solution,但无济于事。有趣的是,CatalogItems工作得很好,直到我在CatalogSubscribers上添加了m:m。它似乎根本没有CatalogItems的问题。我在这里做错了什么?
答案 0 :(得分:0)
通常,您甚至不需要CatalogItem或CatalogSubscriber类。只要唯一的字段是两个外键,EF就会为你推断它们。
public class Catalog {
...
public virtual ICollection<Item> Items {get;set;}
public virtual ICollection<Subscriber> Subscribers {get;set;}
}
public class Item {
...
public virtual ICollection<Catalog> Catalogs {get;set;}
}
public class Subscriber {
...
public virtual ICollection<Catalog> Catalogs {get;set;}
}
在阅读了问题中的两个链接后,两个答案都是正确的。除非您尝试手动创建自定义交叉引用表,如果它只包含外键ID,则不需要该表。在这种情况下,您根本不创建类,并在第二个链接中使用Fluent API告诉EF您在Catalog和Item之间有多对多关系,而另一个在Catalog和Subscriber之间。像这样(我想 - 我通常首先出于数据库习惯):
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Catalog>().HasMany(m => m.Items).WithMany();
modelBuilder.Entity<Catalog>().HasMany(m => m.Subscribers).WithMany();
}