我正在创建一个应用程序,其中需要表的多个外键。我使用的是 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!;
}
任何人都可以帮助我克服这个我犯错误的问题吗?
提前致谢。
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 的代码。实体集合引用将被设置用于更改跟踪,因此它们永远不应该被重新分配。