2013-01-24 221 views
0

考虑下面的例子中如何检测实体存在:实体框架:的DbContext:在数据库

public class Parent 
{ 
    public Guid ID {get;set;} 
    public string Name {get;set;} 
    public Child Child {get;set;} 
} 


public class Child 
{ 
    public Guid ID {get;set;} 
    public string Name {get;set;} 
} 

我要救一个父对象实例,用分配给它的子实例。这里的事实是:在给定的子对象已存在于数据库中,

Parent p = new Parent(); 
p.ID = Guid.NewGuid(); 

// Get the Child Object 
Child c = GetTheChild(...); 
p.Child = c; 

SaveParent (p); 

在功能上保存父,下面的代码实现:

public void SaveParent (Parent p) 
{ 
    using (MyContext context = new ClinicContext()) 
    { 
     context.Parents.Add(P); 
     context.SaveChanges(); 

    } 
} 

现在问题就来了:因为在这个孩子例子已经存在于数据库中,但是当在上下文DBSet中添加父项时,给定的实体c也保持“已添加”的输入状态,猜测什么? DBContext尝试保存另一个带有重复键的子记录!

任何机构都知道如何解决这个问题?我在想如果实体框架可以检测到数据库中已经存在的记录,是否有办法将Insert插入到Update中。

感谢您的帮助。

回答

0

如果添加实体,则会添加所有相关的实体。如果附加实体,则所有相关实体都将被附加。在你的情况下,你想添加父实体,然后附加子实体。你也可以尝试使用外键并添加父项,并将外键设置为相关的子标识。这样您就不必将实体带到客户端来创建关系(但您需要知道相关实体的关键)。

0

你最近怎么样?应该将孩子附加到您保存父母的相同环境中。

我的猜测是你的GetTheChild功能使用新的上下文 - 当你回来时孩子分离,并为所有意图和目的EF人物其被“添加”

正如专家小组说,你可以添加一个外,这意味着键,只需设置孩子的钥匙而不是孩子本身,但似乎有一些设计问题需要解决。

0

我猜GetTheChild()会从数据库中返回一个孩子。因此,您只需调用ChangeObjectState方法即可在调用SaveChanges之前将该子标记为Unchanged。

var osm = context.ObjectStateManager; 
osm.ChangeObjectState(child, EntityState.Unchanged);