【问题标题】:ef 6 many to many relationship giving invalid column erroref 6 多对多关系给出无效列错误
【发布时间】:2016-12-07 17:28:45
【问题描述】:

我按照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
}

我在尝试获取目录时收到错误“无效的列 Subscriber_Id”,并且我可以在 select 语句中看到,由于某种原因,它认为 Subscriber_Id 是目录中的列(它不是)。我试过这个solution,但无济于事。有趣的是,CatalogItems 工作得很好,直到我在 CatalogSubscribers 上添加了 m:m。 CatalogItems 似乎根本没有问题。我在这里做错了什么?

【问题讨论】:

  • 另外,从您的第一个链接开始,如果您没有以流畅的方式进行操作,[Key, Column(Order = 0)] 和 [Key, Column(Order = 1)] 部分很重要。

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


【解决方案1】:

通常您甚至不需要 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();
}

【讨论】:

  • 我试过这种方法,但现在查询目录时它显示 Subscriber_Id 和 Item_Id 的列无效。
  • 使用 EF 约定,在外键字段中使用时应该是 SubscriberId 和 ItemId,或者在 Subscriber/Item 类中使用时应该是 Id(是的,您可以覆盖它以使用 Subscriber_Id 和 Item_Id,但是为什么除非你有商业理由这样做?)你能展示更多你的课程——只是相关的部分吗?喜欢 id 字段?
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多