Linq to entities:update创建新行

时间:2012-06-18 09:26:06

标签: linq entity-framework linq-to-entities

我在使用Linq更新我的数据库时遇到问题。

我有2个实体:消息和作者 我的应用程序检查Web服务并从服务中提取消息和作者。

我的数据库中已经存在消息和作者,因此我会检查重复项。

这适用于作者。新作者被添加,现有的作者得到更新。

然而,这些消息给了我一个奇怪的问题。消息与作者有明显的关系,因此我通过调用将作者添加到我的消息中 Message.Author =作者; 其中作者是我上一步的新作者或更新作者。

显然,一旦我这样做,稍后在我的代码调用提交更改中,实体框架/ linq决定将此新消息添加到数据库,即使我没有对提及对象进行任何调用。它可能是因为与之相关的作者。

任何人都可以在伪代码中使用正确的方法或者使用Linq向作者插入/更新作者和消息吗?

1 个答案:

答案 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();