我首先在 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() 之前“修复”这种情况的方式。
谁能指出我正确的方向?