2016-12-19 44 views
0

我有两个类,我已经简化了这个SO问题。每当我添加一个新的“父母”并附上现有的“孩子”实体时,我最终会得到重复的孩子。我究竟做错了什么?为什么我的实体框架对象重复?

public class Group 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int GroupId { get; set; } 
    public virtual Child ChildOne { get; set; } 
    public virtual Child ChildTwo { get; set; } 
} 

public class Child 
{ 
    [Key] 
    public int ChildId { get; set; } 
    public bool Available { get; set; } 
} 
using (var context = new RPSContext()) 
{ 
    Child childOne = context.Child.Where(p => p.Available == true).OrderBy(p => p.ChildId).FirstOrDefault(); 
    Child childTwo = context.Child.Where(p => p.Available == true).OrderBy(p => p.ChildId).Skip(1).Take(1).FirstOrDefault(); 
} 
Parent parent = new Models.Parent; 
parent.ChildOne = childOne; 
parent.ChildTwo = childTwo; 

using (var context = new RPSContext()) 
     { 
      context.Parent.Add(parent); 
      parent.ChildOne.Available = false; 
      parent.ChildTwo.Available = false; 
      context.SaveChanges(); 
     } 

我希望当我简化了这个代码,我没有做任何的错误。任何人都可以协助

+0

我猜你的意思是“组”。你会得到两个新的“儿童”记录? –

+0

是的,它确实是一对多的关系。父/子是错误的术语,但我确实得到了多个子对象。 –

+0

我想知道是否有一些背景废话在这里进行。你可以重构这个,所以你只有一个'新的RPSContext'? – Vlad274

回答

1

尝试在单个上下文中执行。您在获取childOne和childTwo后立即处理一个上下文。

所以,你可能需要在新的背景下 context.Child.Attach(childOne);context.Child.Attach(childTwo‌​);

在同样的情况下附上这两个孩子实体或进行这两种操作使子实体得到相关的,而不是用'Parent`获取添加

+0

我发现合并成一个上下文没有影响,但附加。谢谢你的帮助! –

+1

@AbrahamLincoln您是否忽略了您为此问题复制的代码中的.AsNoTracking?如果组合成一个上下文没有解决它,那么你加载子实体的方式不同于“正常” – Vlad274

+0

@ Vlad274 - 多数民众赞成在真正的东西,与附加应用也应该在同一个上下文IMO除非明确禁用跟踪 – Developer