我在使用Linq更新我的数据库时遇到问题。
我有2个实体:消息和作者 我的应用程序检查Web服务并从服务中提取消息和作者。
我的数据库中已经存在消息和作者,因此我会检查重复项。
这适用于作者。新作者被添加,现有的作者得到更新。
然而,这些消息给了我一个奇怪的问题。消息与作者有明显的关系,因此我通过调用将作者添加到我的消息中 Message.Author =作者; 其中作者是我上一步的新作者或更新作者。
显然,一旦我这样做,稍后在我的代码调用提交更改中,实体框架/ linq决定将此新消息添加到数据库,即使我没有对提及对象进行任何调用。它可能是因为与之相关的作者。
任何人都可以在伪代码中使用正确的方法或者使用Linq向作者插入/更新作者和消息吗?
答案 0 :(得分:1)
EF始终处理对象图中的所有实体。如果您将Author
附加到EF上下文并将该作者实例分配给分离的Message
实例,则EF会将其检测为对象图中的新实体。您必须告诉EF该实体不是新实体,而是通过更改其状态来存在。
if (IsNewAuthor(author)) {
context.Add(author);
} else {
context.Attach(author);
context.ObjectStateManager.ChangeObjectState(author, EntityState.Modified);
}
message.Author = author;
context.ObjectStateManager.ChangeObjectState(message, EntityState.Unchanged);
context.SaveChanges();