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"); 

     } 

의 내 작업 버전으로 시작하고 싶은, 내가 책 객체와 관계를 추가 할 데이터베이스에서 저자 개체 (기록)를 가져 오는하고있다. 반면, 데이터베이스에서 책 객체를 가져 오지 않지만 컨텍스트에 첨부합니다. 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);처럼?

IOW,

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

감사 @thedeeno. 그러나 그것은 전혀 아무것도하지 않았습니다. 오류 및 중복이 없습니다. –

+0

코드를이 코드로 바꿨습니다. 저자 이전에 책을 첨부하는 것이 핵심이었습니다. 'db.Books.Attach (book); foreach (저자의 저자) { db.Authors.Attach (a); } book.Authors.Clear(); foreach (저자의 저자) { book.Authors.Add (a); } ' –

+0

그래서 책을 첨부하면 처음에는 도움이 되었습니까? –

관련 문제