【问题标题】:optional many to one or zero issue in Entity Framework实体框架中的可选多对一或零问题
【发布时间】:2015-07-11 22:05:11
【问题描述】:

我正在尝试创建一个快速演示商店,但由于optional many to one or zero 关系而失败。

相关的类是:

  1. 物品

    public class Item
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int SubCategoryID { get; set; }
        public virtual SubCategory Category { get; set; }
        public double Price { get; set; }
    }
    
  2. 订购

    public class Order
    {
        public int ID { get; set; }
        public DateTime DateOfOrder { get; set; }
        public virtual ICollection<Item> Items { get; set; }
        public int CustomerID { get; set; }
        public virtual Customer Customer { get; set; }
    }
    

但是,我很困惑,因为查看模型显示:

但是,数据库本身显示(对于项目):

这向我表明每件商品只能属于一个订单。

我是否必须创建一个包含多对多订单/项目的单独类?

我似乎记得 EF 会自动执行此操作,但是,我已经有几年没有碰过它了,我只是不记得我以前做了什么。

【问题讨论】:

  • 我认为这会非常简单,但是,我尝试从这里复制各种示例,但我似乎运气不佳......

标签: sql-server database entity-framework entity-framework-6 code-first


【解决方案1】:

我必须补充:

public virtual ICollection<order> Orders { get; set; }

到项目...我永远不会这样称呼它,但 EF 似乎需要这样来建立这种关系。

我相信它曾经更容易,所以,让这个问题保持开放,以便有人可以给出更好的答案!

【讨论】:

  • 如果你不想要“Orders”属性,你也可以使用fluent api来配置关系:modelBuilder.Entity&lt;Order&gt;().HasMany(t =&gt; t.Items).WithMany()
【解决方案2】:

如果您将Orders 的集合添加到Item 实体,EF 将在您的数据库中为您隐式创建junction table。在此page 中,您可以找到有关如何配置多对多关系的更多信息。

当您需要添加额外的列(不包括您要连接的表的两个键)时,通常会映射联结表。在这种情况下,您需要分别在表示联结表的实体与OrderItem 之间创建两个一对多关系。有些人建议始终映射联结表,因为这样您就可以将所有表表示为实体,并且可以从联结表开始编写查询。您可以在link 中找到有关此主题的有趣信息。但是,根据我的经验,在大多数情况下,您无需显式映射联结表即可完美工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多