我正在试图找出在向它添加子(一对多连接)的情况下,什么会导致实体乘法。
我的代码非常复杂,类有更多的属性,但主要问题如下。
下面是一个示例代码:
public class Parent
{
public int Id { get; set; }
public List<Child> Children { get; set; }
public string Name { get; set; }
public Parent()
{
Children = new List<Child>();
}
}
public class Child
{
public int Id { get; set; }
public Parent Parent { get; set; }
public int ParentId { get; set; }
public string ParentName { get; set; }
}
子节点可以在没有父服务器的情况下生存,父也可以。
因此,当我想连接两个实体时,它必须在代码中很好地工作。如果已经创建了一个新的父实体,则不可能创建一个新的父实体。这个过程是线性的。
例如,我首先在没有父级(这是第一个状态)的情况下创建三个子,并将其保存到Db中。然后,我“处理”实体(可能在创建孩子一天后):
如果找不到一个名为dbContext.
H 118
保存该,而我有没有父级的任何子级。H 221F 222
代码示例:
public void ProcessChildren()
{
IDbContextTransaction trans = dbContext.BeginTransaction();
foreach(var item in Children) //Children is a list of child entities (existing in the DB)
{
var parent = dbContext.Parents.SingleOrDefault(x => x.Name == item.ParentName);
if(parent == null)
{
parent = new Parent{Name = item.ParentName};
dbContext.Parents.Add(parent);
}
parent.Children.Add(item);
dbContext.SaveChanges();
}
trans.Commit(); //rollback implemented if it fails
}
我那时(只是偶尔也很少)的是3的父母和3个孩子的女巫没有ParentIds,所以看起来(对我来说) EF在某种程度上崩溃了,并且意外地这样做了。
因此,这个bug发生在一个巨大的过程中(从几十万个孩子那里创建了很少的父母),而这个错误出现的几率仍然很低(并不是有意复制的)。然而,在我的系统中,它会造成后果。
有人听说过这样的行为吗?也许问题在于EF (EntityFramework 6.2.0Nuget)或它的Npgsql扩展(EntityFramework6.Npgsql 3.1.1Nuget)?
编辑:添加了保存和创建实体的代码示例。Edit2:父引用异常修复。很抱歉,代码是在这里编写的--这是它的工作方式的一个例子,而不是代码本身。
发布于 2019-10-16 23:23:08
在这行之后,您只需在数据库上下文中添加新的父变量,但是“父”变量不会更改,它将保持为空。
if(parent == null)
{
dbContext.Parents.Add(new Parent{Name = item.ParentName});
}
因此,每次父级为空时,当您想访问空变量时,您的代码都会崩溃,parent.Children.Add(item);
您可以尝试将父变量分配给新添加的父对象。
if (parent == null)
{
parent = dbContext.Parents.Add(new Parent{Name = item.ParentName});
}
https://stackoverflow.com/questions/58426252
复制相似问题