对EF 5中的新对象使用循环外键引用的更好方法

时间:2013-08-29 14:02:51

标签: entity-framework entity-framework-5 dbcontext circular-reference

我首先在Web项目中使用EF 5.0,DB。

对于我们的服务层,我们将Agatha与AutoMapper一起使用,因此所有数据都作为POCO对象到达服务层。

我有一个如下所示的数据结构:

public class FirstClass
{
    public int Id { get; set; }

    public int? SelectedSecondClassId { get; set; }
    public SecondClass SelectedSecondClass { get; set; }

    public ICollection<SecondClass> MySecondClasses { get; set; } 

    //other properties go here
}

public class SecondClass
{
    public int Id { get; set; }

    public int ParentSecondClassId { get; set }
    public SecondClass ParentSecondClass { get; set; }

    //other properties go here
}

现在假设我尝试更新FirstClass对象并在1中执行以下操作:

  • 在MySecondClasses集合中创建2个新的Secondclass对象(均为id 0)
  • 将其中一个新创建的对象设置为SelectedSecondClass

然后EF拒绝打球。我无法让它发挥作用。如果我查看changetracker,我会看到实体上的SelectedSecondClass再次为空,但是SelectedSecondClassId设置为0.这是他无法解决的问题,因为在正确创建之前有2个Id 0对象

如果我这样做,我可以解决问题:

var newId = -1;
foreach (var newSecondClass in firstClass.MySecondClasses.Where(x => x.Id <= 0))
{
    newSecondClass.Id = newId;
    newId --;
}

if (firstClass.SelectedSecondClass != null) 
{ 
    firstClass.SelectedSecondClassId = firstClass.SelectedSecondClass.Id;
}

// Send the updates to EF

根据您的理解,我觉得这有点被黑客攻击,而另一位开发人员很容易忘记这样的事情。我想有一个更好的方法来做到这一点。最好以我在DbContext包装器中的SaveChanges()之前“修复”这种情况的方式。

有人能指出我正确的方向吗?

0 个答案:

没有答案