我拥有具有多对多关系的书籍和作者实体,并且我试图使用数据库第一种方法保存关系(联结表中的记录)。添加多对多关系而无需从数据库获取子实体
我想先从代码
[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");
}
感谢@thedeeno。但它根本没有做任何事情。没有错误和重复。 – 2012-07-06 03:29:11
我将代码更改为此并且其工作正常。在作者之前添加书是最重要的事情。 '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
因此,附加书首先帮助,纠正? – 2012-07-06 13:23:14