Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入相关实体的相关实体无法填充主父实体的外键_C#_Entity Framework Core - Fatal编程技术网

C# 插入相关实体的相关实体无法填充主父实体的外键

C# 插入相关实体的相关实体无法填充主父实体的外键,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

我正在使用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; }
}
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)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
         });
}