2

我拥有具有多对多关系的书籍和作者实体,并且我试图使用数据库第一种方法保存关系(联结表中的记录)。添加多对多关系而无需从数据库获取子实体

我想先从代码

[HttpPost] 
     public ActionResult Edit(BookViewModel bookv) 
     { 
      Mapper.CreateMap<AuthorViewModel, Author>(); 
      List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>> 
(bookv.Authors.ToList()); 
//remove authors from book object to avoid multiple entities with same key error 
      bookv.Authors.Clear(); 
      Mapper.CreateMap< BookViewModel,Book>(); 
      Book book = Mapper.Map<BookViewModel,Book>(bookv); 

      db.Books.Attach(book);   
      book.Authors.Clear(); 
      foreach (Author a in authors) 
      { 
       //Fetch Author and add relation to book object 
       book.Authors.Add(db.Authors.Single(at=>at.AuthorId==a.AuthorId)); 
      } 

      db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 

     } 

我的工作版本在上面的代码中,我从数据库中获取作者的对象(记录)添加与书对象关系。而我不是从数据库中获取Book对象,而是将它附加到上下文中。我能不能用Author对象做类似的事情?

我曾尝试使用此代码要做到这一点,但它第一次增加了新的记录,作者表,并增加了与图书和关系新创建(无用)作者:

[HttpPost] 
    public ActionResult Edit(BookViewModel bookv) 
    { 
     Mapper.CreateMap<AuthorViewModel, Author>(); 
     List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>>(bookv.Authors.ToList()); 
    // bookv.Authors.Clear(); 
     Mapper.CreateMap< BookViewModel,Book>(); 
     Book book = Mapper.Map<BookViewModel,Book>(bookv); 

     foreach (Author a in book.Authors) 
     { 
      db.Authors.Attach(a); 
     } 

     db.Books.Attach(book); 

     foreach (Author a in authors) 
     { 
      book.Authors.Add(a); 
     } 
    db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 

     } 

回答

2
[HttpPost] 
     public ActionResult Edit(BookViewModel bookv) 
     { 
      //create maps 
      Mapper.CreateMap<AuthorViewModel, Author>(); 
      Mapper.CreateMap<BookViewModel, Book>(); 

      //convert view objects to model objects 
      Book book = Mapper.Map<BookViewModel, Book>(bookv); 
      List<Author> authors = Mapper.Map<List<AuthorViewModel>, List<Author>> (bookv.Authors.ToList()); 

      book.Authors.Clear(); 
      db.Books.Attach(book); 


      foreach (Author a in authors) { db.Authors.Attach(a); } 

      book.Authors.Clear(); 

      foreach (Author a in authors) { book.Authors.Add(a); } 

      db.ObjectStateManager.ChangeObjectState(book, EntityState.Modified); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 

     } 
1

你有没有尝试过呼叫db.Books.Attach(book)db.Authors.Attach(a)循环?

另外,你有没有尝试将书添加到作者?像a.Books.Add(book);而不是?

督察,

db.Books.Attach(book); 
foreach (Author a in book.Authors) 
{ 
    db.Authors.Attach(a); 
    a.Books.Add(book); 
} 
+0

感谢@thedeeno。但它根本没有做任何事情。没有错误和重复。 – 2012-07-06 03:29:11

+0

我将代码更改为此并且其工作正常。在作者之前添加书是最重要的事情。 'db.Books.Attach(book); foreach(作者a在作者中) { db.Authors.Attach(a); } book.Authors.Clear(); foreach(作者作者a) { book.Authors.Add(a); }' – 2012-07-06 04:32:46

+0

因此,附加书首先帮助,纠正? – 2012-07-06 13:23:14

相关问题