我有一个父对象书,该对象的属性是发布者。每当我刊登一本书时,即使发布商已经存在,它也会添加新的发布商。有人可以告诉我如何添加图书而不是再次添加发布者,只需引用现有的图书吗?我正在使用的代码如下......提前致谢!
public class Book
{
public int BookID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime CreateDate { get; set; }
public virtual Publisher Publisher { get; set; }
}
public class Publisher
{
public int PublisherID { get; set; }
public string Address { get; set; }
}
public class SqlCEDataStore : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Publishers> Publishers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.IncludeMetadataInDatabase = false;
}
}
public class TimeSinkRepository : IRepository<Book>
{
private static SqlCEDataStore context = new SqlCEDataStore();
public int Add(Book entity)
{
context.Books.Add(entity);
return context.SaveChanges();
}
}
var book = new Book()
{
Title = "New Title",
Description = "New Description",
CreateDate = DateTime.Now,
Publisher = new Publisher() { PublisherID = 1 }
};
var repository = new BookRepository();
var result = repository.Add(book);
答案 0 :(得分:0)
问题在于:
Publisher = new Publisher() { PublisherID = 1 }
对象上下文不知道这是现有的发布者。它是新创建的实体,因此Object上下文将执行插入操作。您必须说不是新创建发布者对象的对象上下文。一种方法是修改Add方法:
public int Add(Book entity)
{
context.Books.Add(entity);
// 0 means new one, other values mean existing one
if (entity.Publisher.PublisherID > 0)
{
context.ObjectStateManager.ChangeObjectState(entity.Publisher, EntityState.Unchanged);
}
context.SaveChanges();
}
答案 1 :(得分:0)
你可以通过确保在添加Book实体之前将Publisher附加到Publishers上下文来解决这个问题(这样它就知道它是dbcontext中的Publisher而不是它需要添加的新的(再次))
context.Publishers.Attach(book.Publisher); // This is only possible if the Publisher is not new
context.Books.Add(book);
答案 2 :(得分:0)
问题出在这一行 Publisher = new Publisher(){PublisherID = 1}
你应该做一个像这样的获取方法 - 从上下文中获取所需的发布者(例如,id = 1) - 将返回的对象设置为新书对象的发布者 - 上下文应该为你排序休息。当你保存书籍。 (不需要弄乱对象状态管理器)
祝你好运,如果你不能让这个工作提出一些代码,我会帮助你。