【问题标题】:many to many relationship adding items多对多关系添加项目
【发布时间】:2019-04-26 13:44:15
【问题描述】:

我正在使用本网站建议的以下两个类:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

   public class Barca
   {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BarcaID { get; set; } 
    public virtual ICollection<Imbarco> Imbarco { get; set; }
    public virtual Imbarco ImbarcoBase { get; set; }
    }

   public class Imbarco
   {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ImbarcoID { get; set; }
    public virtual ICollection<Barca> Barche { get; set; }
    public virtual ICollection<Barca> BaseBarche { get; set; }
    }

我需要创建 1 对 M 关系,为此我使用了以下 2 个导航属性:

public virtual Imbarco ImbarcoBase { get; set; }
public virtual ICollection<Barca> BaseBarche { get; set; }

但我还需要 M 对 M 关系,为此我使用了:

public virtual ICollection<Imbarco> Imbarco { get; set; }
public virtual ICollection<Barca> Barche { get; set; }

当我尝试在 M 到 M 中添加新项目时,未在数据库中创建桥接表,如上面报告的链接中所述,并且我尝试在 VisualStudio 中生成的 edmx 文件创建了一个 0.. 1 到 M 和 M 到 0..1 的关系,而不是 m 到 M。 我做错了什么?

【问题讨论】:

  • 您可能需要另一个类来表示桥(连接)表,该表具有其他表的两个外键作为属性。
  • 我在 2014 年的论坛中找到了您的建议,但我认为桥接表是在 EF6 中自动创建的,如此处所述entityframeworktutorial.net/code-first/…,或者我错了吗?
  • 你是否在每个类的构造函数中添加了集合初始化?
  • 你的意思是像:public Barca() { this.Imbarco = new HashSet();不,我没有添加它们...我现在试试
  • @WMmaster 我认为这取决于您是否将code-first 方法与EF 一起使用。

标签: c# entity-framework-6 asp.net-4.5


【解决方案1】:

我将从修复您的模型开始。我建议您使用 fluent api 进行配置,但您可以尝试使用 InverseProperty annotation 以便 EF 建立正确的连接:

   public class Imbarco
   {
       [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
       public int ImbarcoID { get; set; }

       [InverseProperty("Imbarco")]
       public virtual ICollection<Barca> Barche { get; set; }
       [InverseProperty("ImbarcoBase")]
       public virtual ICollection<Barca> BaseBarche { get; set; }
    }

【讨论】:

  • 使用您的建议,我现在收到以下错误消息:索引 'IX_ImbarcoBase_ImbarcoID' 依赖于 'ImbarcoBase_ImbarcoID'。对象“FK_dbo.Barcas_dbo.Imbarcoes_ImbarcoBase_ImbarcoID”取决于列“ImbarcoBase_ImbarcoID”。无法执行 ALTER TABLE DROP COLUMN ImbarcoBase_ImbarcoID,因为一个或多个对象正在使用它。但为什么它试图放弃 ImbarcoBase 呢?这是因为一对多的关系运作良好
  • 是的,EF 可能为第二个关系添加了另一个 ImbarcoID。要么全部重建,要么你可以使用流畅的代码来正确匹配 FK。
  • 我怎样才能用更多的字符回复你的帖子?我尝试使用 add-migrations 和 update-database 但我无法显示结果
  • 我收到错误“参数 objname 不明确或声明的 objtype (COLUMN) 错误”即使添加迁移想要创建桥接表,所以我想我是对的方向
  • 当您需要添加其他信息时编辑您的问题。令人困惑的是,我现在看到您提到了 edmx 和迁移。它们不共存。 EDMX 是数据库优先,迁移是代码优先。
猜你喜欢
  • 2017-12-08
  • 2012-09-03
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多