实体框架和一对多关系不能保存正确

时间:2014-12-05 18:43:36

标签: entity-framework entity-framework-5

几年前我和Entity Framework合作过,这可能只是让我有点生疏了。我有分离的实体,而实体又有多个子实体。就我而言,它是一个人实体,每个人都有多个地址。

myPerson.FirstName="update first name";
//assuming they already have an address in the first entry 
//with appropriate primary keys and foreign key ids, I could do:
myPerson.Addresses.First().Line1="update line 1";
myPerson.Addresses.Add(new Address(){line1="weee",line2="aaaa" postal="12345", type="work"});
myDb.Person.Attach(myPerson);
myDb.Entry(myPerson).State=EntityState.Modified;
myDb.SaveChanges();

当我做这样的场景时,我得到了我对第一个名字的期望。它会更新第一个名称,并且正如预期的那样,实际上会清除上面代码中的所有其他字段(LastName,Birthday等)。但是,它不会为此人创建新地址,也不会更新现有地址。

我不记得需要为数据库上下文做额外工作才能知道如何更新与上述人员相关的相关实体。在我的谷歌搜索中,我似乎听到了一个故事,我需要做大量的工作,从数据库加载集合,然后以这种方式去城镇。我希望事实并非如此。

1 个答案:

答案 0 :(得分:0)

您粘贴的代码的关键部分是这些行......

myDb.Person.Attach(myPerson);
myDb.Entry(myPerson).State=EntityState.Modified;

第一行将整个对象图附加到上下文,并将此图中每个实体的状态设置为Unchanged。第二行代码将只将根实体的状态设置为Modified(其他的,例如Address实体,将保持Unchanged状态)。保存更改后,只会更新单个实体。

当然,这假设您正在使用断开连接的实体(使用一个上下文来获取对象图,而使用另一个上下文来执行更新)。我假设你正在附加实体。

/ * Rant On * /

令人遗憾的是,断开连接的实体在EF空间中处理得不好。您将在书籍和博客中找到大量样本,以尝试解决断开连接的实体,但当您尝试实施更高级的方案(例如包含相关项目集合的对象图)时,这些策略会迅速崩溃。

/ * Rant Off * /