无法使用 SET NULL 引用操作创建外键,因为一个或多个引用列不可为空

问题描述 投票:0回答:1

我正在创建一个应用程序,其中需要表的多个外键。我使用的是 ASP.Net core 6.0、EF Core 7.0.11 和 MS SQL Server 2019。我使用代码优先方法来实现此解决方案。我收到以下错误:

无法使用 SET NULL 引用操作创建外键“FK_GkTempGks_GkAdminUser_VerifiedBy”,因为一个或多个引用列不可为空。

这是我的模型: 主实体

public class GkAdminUser
{    
  public int Id { get; set; }
  public string? UserName { get; set; }
  public string? UserPassword { get; set; }
  public string? FirstName { get; set; }
  public string? LastName { get; set; }
  public string? FullName => $"{FirstName} {LastName}";
  public string Email { get; set; } = null!;
  public bool St { get; set; }   
  public int RoleId { get; set; }
  public virtual GkRole? GkRole { get; set; }        
  public virtual ICollection<GkTempGks>? GkTempGkOperators { get; set; }
  public virtual ICollection<GkTempGks>? GkTempGkVerifiedBy { get; set; }
}

交易主体:

public class GkTempGks
{   
   public int Id { get; set; }
   public string Question { get; set; } = null!;
   public string Option1 { get; set; } = null!;
   public string Option2 { get; set; } = null!;
   public string Option3 { get; set; } = null!;
   public string Option4 { get; set; } = null!;
   public int Answer { get; set; }
   public string? Remarks { get; set; }    
   public int Complexity { get; set; }     
   public DateTime EntryDate { get; set; }
   public bool IsVerified { get; set; }
   public DateTime? VerificationDate { get; set; }
   public string? ContentReference { get; set; }
   public int OperatorId { get; set; }      
   public int? VerifiedBy { get; set; }       
   public int CategoryId { get; set; }
   public virtual GkCategory GkCategory { get; set; } = null!;
   public virtual GkAdminUser GkOperator { get; set; } = null!;    
   public virtual GkAdminUser? GkDataVerifier { get; set; } = null!;
}

任何人都可以帮助我克服这个我犯错误的问题吗?

提前致谢。

asp.net asp.net-core entity-framework-core foreign-keys
1个回答
0
投票

EF 可能会与多个引用混淆。您应该明确哪些 FK 适用于哪些导航属性。

public int OperatorId { get; set; }      
public int? VerifiedBy { get; set; }       
public int CategoryId { get; set; }

[ForeignKey(nameof(CategoryId))]
public virtual GkCategory GkCategory { get; set; } = null!;
[ForeignKey(nameof(OperatorId))]
public virtual GkAdminUser GkOperator { get; set; } = null!;    
[ForeignKey(nameof(VerifiedBy))]
public virtual GkAdminUser? GkDataVerifier { get; set; } = null!;

EF 解析 FK 的约定基于导航属性的 type,而不是名称。因此,默认情况下,使用像

GkAdminUser GkOperator
这样的导航属性,它将查找“GkAdminUserId”FK,而不是“GkOperatorId”,也不会自动关联“OperatorId”。您可能还需要指定另一端的哪个集合与每个引用关联。这可以通过
[InverseProperty]
属性来完成,也可以通过使用
.HasOne(x => x.GkOperator).WithMany(x => x.GkTempOperators)
显式映射关系来完成。 (
DbContext.OnConfiguring()
或带有
IEntityTypeConfiguration

请注意,对于集合导航属性,这些属性不应为空。只需用空集合初始化它们即可。

public virtual ICollection<GkTempGks> GkTempGkOperators { get; protected set; } = new  List<GkTempGks>();
public virtual ICollection<GkTempGks> GkTempGkVerifiedBy { get; protected set; } = new  List<GkTempGks>();

限制 setter 以阻止任何可能想要使用 setter 的代码。实体集合引用将被设置用于更改跟踪,因此它们永远不应该被重新分配。

© www.soinside.com 2019 - 2024. All rights reserved.