【问题标题】:Many to many relationship inserts多对多关系插入
【发布时间】:2015-10-08 17:49:45
【问题描述】:

我有两个类,例如:

class A {
    public virtual ICollection<B> BList { get; set; }
}

class B {
    public virtual ICollection<A> AList { get; set; }
}

Entity Framework 然后创建 A 和 B 表以及连接它们的 AB 表。

在我的应用程序中,我得到A_ID 和B_ID,我需要在A 和B 之间建立连接。

我所做的是通过 ID 获取 A,然后通过 ID 获取 B,然后执行 A.BList.Add(BObject),但这是 3 次数据库行程,2 次获取 + 1 次插入。

Entity Framework 中是否有任何方法可以在一次数据库之旅中完成?

更新:

看了Martin提供的链接,写了一个简单的例子:

User user = new User { ID = 12135 };
Book book = new Book { ID = 1};

context.Users.Attach(user);
context.Books.Attach(book);

user.Books.Add(book);  

context.SaveChanges();

但是我在user.Books.Add(book); 得到空指针异常user.Books 为null,并且在调用Add 时抛出异常...

【问题讨论】:

  • This 链接显示了仅使用一次(插入)往返的解决方案。
  • 我自己看了链接!多么扭曲但合乎逻辑的方式,老实说,我并没有怀疑这样的事情会起作用,令人难以置信。
  • @Aleksa 这些表的主键名称在你的情况下真的被命名为“ID”吗?
  • 是的,ID 是两个类的主键。

标签: c# asp.net entity-framework many-to-many


【解决方案1】:

您需要在实体的构造函数中初始化您的集合导航属性:

public class A {
    public A()
    { 
       BList=new List<B>();
    }
    public virtual ICollection<B> BList { get; set; }
}

对 B 实体执行相同操作。

此外,您不需要在开始时附加新实体,要保存它们,您可以这样做:

  User user = new User { ID = 12135 };
  Book book = new Book { ID = 1};

  user.Books.Add(book);  
  context.Users.Add(user);
  context.SaveChanges();

这将在一次数据库行程中插入三行

【讨论】:

    【解决方案2】:

    也许你可以恢复你的代码并试试这个:

    User user = new User { 
                           ID = 12135 , 
                           Books = new ICollection<Book>() { new Book { ID = 1} } 
                         };
    
    context.Users.Attach(user);
    

    或者:

    User user = new User { ID = 12135 };
    Book book = new Book { ID = 1};
    
    context.Users.Attach(user);
    context.Books.Attach(book);
    
    user.Books = new ICollection<Book>();
    
    user.Books.Add(book);
    

    要解决空指针期望,需要在代码或用户类构造函数中添加一个初始化器到Books用户集合。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2023-03-20
      • 2017-02-12
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多