在书籍和作者之间通常存在许多对许多的关系。尝试更新作者时出现错误。错误的全名是“ SqlException:违反主键约束'PK_BookAuthor'。无法在对象'dbo.BookAuthor'中插入重复键。重复键值为(2,2)。”。
如果我不使用UpdateAssociatedObject函数,则一切正常。但是,如果使用它,则在尝试保存更改时会收到错误消息。
var parseBook = Mapper.Map<BookViewModel, Book>(viewModel);
Book viewModelBook = parseBook;
var book = db.Books.FindOne(viewModel.BookId);
book.BookId = viewModelBook.BookId;
book.BookName = viewModelBook.BookName;
book.Genre = viewModelBook.Genre;
book.Pages = viewModelBook.Pages;
book.Publisher = viewModelBook.Publisher;
db.SaveChanges();
UpdateAssociatedObject(book, viewModelBook);
}
public void UpdateAssociatedObject(Book bookForUpdate, Book book)
{
bookForUpdate.BookAuthors = book.BookAuthors;
//error is here
db.SaveChanges();
}
映射后viewModelBook的值: 模型(为简洁起见,删除了一些属性)
public class Book
{
public int BookId { get; set; }
public List<BookAuthor> BookAuthors { get; set; }
}
public class Author
{
public int AuthorId { get; set; }
public string AuthorName { get; set; }
public List<BookAuthor> BookAuthors { get; set; }
}
public class BookAuthor
{
public int BookId { get; set; }
public Book Book { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
}
public class BookViewModel
{
public int BookId { get; set; }
public virtual List<AuthorViewModel> Authors { get; set; }
}
public class AuthorViewModel
{
public int AuthorId { get; set; }
public string AuthorName { get; set; }
}
UPD:创建书籍后,BookId会跳(以1000为步长)。
将Include()添加到Find方法后,错误更改为
System.InvalidOperationException:无法跟踪实体类型'BookAuthor'的实例,因为已经跟踪了另一个具有相同的{'BookId','AuthorId'}关键字值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'来查看冲突的键值。
湖上湖
婷婷同学_
相关分类