C# 插入相关实体的相关实体无法填充主父实体的外键
我正在使用Entity Framework Core 3.0,在将对象插入导航属性和正确维护父外键方面遇到问题 我有两个模型课 EntityType.csC# 插入相关实体的相关实体无法填充主父实体的外键,c#,entity-framework-core,C#,Entity Framework Core,我正在使用Entity Framework Core 3.0,在将对象插入导航属性和正确维护父外键方面遇到问题 我有两个模型课 EntityType.cs public class EntityType { public int TypeId { get; set; } public string Name { get; set; } public virtual ICollection<Criteria> Criterias { get; set; } } p
public class EntityType
{
public int TypeId { get; set; }
public string Name { get; set; }
public virtual ICollection<Criteria> Criterias { get; set; }
}
public class Criteria
{
public int CriteriaId { get; set; }
public int TypeId { get; set; }
public int? ParentCriteriaId { get; set; }
public string Name { get; set; }
public virtual EntityType Type { get; set; }
public virtual Criteria ParentCriteria { get; set; }
public virtual ICollection<Criteria> Criterias { get; set; }
}
所以我实现了UnitOfWork/Repository模式,并有一个使用该模式的服务层。
我插入“EntityType”和一对多“Criteria”的服务层如下-
- 请注意,这是一个服务层,调用方正在传入 “EntityTypeDTO”对象,其中包含“条件”对象列表 我也有逻辑去创建一个“孩子”的列表,而不是 如图所示
Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参见内部异常。
--->Microsoft.Data.SqlClient.SqlException(0x80131904):INSERT语句与外键约束“FK_Criteria_EntityTypes_TypeId”冲突。数据库中发生冲突
所以我知道问题发生在哪里,但不知道为什么。在遍历条件的子级并添加到Criterias.Criterias集合时,EF似乎无法解析TypeId。目前,我一直在使用以下解决方法-
而不是像这样将子criteria对象添加到“criteria”列表中
我必须像这样手动设置EntityType对象(但我不应该这样做):
对于EntityType下的Criteria对象,存在一对多映射,因此EF可以正确设置TypeId属性。但对于子条件对象,无法告诉EF从何处获取TypeId属性的值,因此它会提醒0(因此FK约束异常)
我认为除了您演示的方法之外,没有其他方法可以解决这个问题,除了在TypeId属性和数据库中的列中允许空值 嗨,谢谢你的回答。我认为这行代码
type.Criterias.Add(criteria)如果我将所有的标准添加到“type”对象中,那么“TypeId”将向下渗透到所有的子标准中
builder.HasOne(x => x.Type).WithMany(x => x.Criterias).HasForeignKey(x => x.TypeId).OnDelete(DeleteBehavior.Restrict);
builder.HasOne(x => x.ParentCriteria).WithMany(x => x.Criterias).HasForeignKey(x => x.ParentCriteriaId).OnDelete(DeleteBehavior.Restrict);
// The main parent object to be created
EntityType type = new EntityType
{
Name = entityTypeDTO.Name
};
foreach (CriteriaDTO criteriaDTO in entityTypeDTO.Criterias)
{
// Create the top level Criteria object which will be the "Parent"
// No problem here, EF is able to populate the TypeId FK for the Parent
Criteria criteria= new Criteria
{
Name = criteriaDTO.Name
};
foreach (CriteriaDTO childDTO in children)
{
// Loop through the children of the parent and add to the navigation property
// Here is where the problem is, EF is able to populate the ParentCriteriaId FK but
// for some reason cannot resolve the TypeId FK
criteria.Criterias.Add(new ModelCriteria
{
Name = childDTO.Name
});
}
type.Criterias.Add(criteria);
}
UnitOfWork.ModelTypeRepository.Add(type);
await UnitOfWork.SaveAsync();
foreach (CriteriaDTO childDTO in children)
{
criteria.Criterias.Add(new ModelCriteria
{
Name = childDTO.Name
});
}
foreach (CriteriaDTO childDTO in children)
{
criteria.Criterias.Add(new ModelCriteria
{
Name = childDTO.Name,
EntityType = type
});
}