ef 6多对多关系给出无效的列错误

时间:2016-12-07 17:28:46

标签: c# sql-server asp.net-mvc entity-framework-6 linq-to-entities

我根据这里的建议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的问题。我在这里做错了什么?

1 个答案:

答案 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();
}