2012-08-07 52 views
0

我与两张桌子有一对多关系,Parent有很多Child。 我创建一个父项并向其添加子项。然后,我创建它(如果它是一个新父项)或更新它(如果它已经存在)。创建它时,一切正常。但是,如果我更新它,孩子们不会更新。如何更新实体框架中的子表?

using (var Repo = new ParentRepository(context)) 
{ 
    var key = new AnnualFormKey(prnt.Year, prnt.UserId); 
    if (Repo.Retrieve(key) == null) 
    { 
     prnt.CreatedDate = DateTime.Now; 
     prnt.CreatedId = 1; 
     Repo.Create(prnt); 
     Repo.SaveChanges(); //creates parent and children 
    } 
    else 
    { 
     prnt.UpdatedDate = DateTime.Now; 
     prnt.UpdatedId = 2; 
     Repo.Update(prnt); 
     Repo.SaveChanges(); //updates parent but not children 
    } 
} 

(注:更新调用_context.Entry(orginal).CurrentValues.SetValues(entity)

这是我的上下文中的问题,或者我需要做些别的事情

回答

-1

好吧,我更深入地研究了这一点,发现实体框架并没有实际更新复杂的实体(因为它不会保存ch ildren)。有很多复杂的解决方法,但我的很简单。我刚刚删除了现有实体并再次创建它(使用更新后的版本)。

+2

只需提及:不幸的是,在大多数情况下,您需要“复杂的变通办法”,因为您不能总是删除旧的实体,因为数据库中可能有其他实体引用父或子外键约束或因为您想保留一些列值不变,只更新其他一些列。你有幸在你的情况下:) – Slauma 2012-08-07 22:26:21

1

留下你的电话Repo.Update(prnt),除非你明确分离的对象?在Repo.Retrieve。它已经被跟踪。

+0

当我这样做,它无法改变父母。这是跟踪我的问题吗? – proseidon 2012-08-07 20:46:48

+0

无法真正从你在那里发布的代码中辨别出来。如果我的解决方案不起作用,那么我认为您的回购正在做比平常更复杂的事情! – Richard 2012-08-07 21:02:57