如何使用Fluent API定义可空的外键

本文关键字:定义 何使用 Fluent API | 更新日期: 2023-09-27 17:54:02

我有两个表

 1. Account 
 2. Users

Account表中,DefaultExpensePartnerAccountOwnerUsersUserId字段的外键。我定义的类如下:

public class Account
{
    public int AccountId { get; set; }
    public string AccountName { get; set; }
    public int? AccountOwnerId { get; set; }
    public int? DefaultExpensePartnerId { get; set; }
    public virtual Users AccountOwner { get; set; }
    public virtual Users DefaultExpensePartner { get; set; }
}
public class AccountConfiguration : EntityTypeConfiguration<Account>
{
    public AccountConfiguration()
    {
        this.ToTable("Account");
        this.HasKey(c => c.AccountId);
        this.Property(c => c.AccountId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .IsRequired();
        this.Property(c => c.AccountName)
            .HasMaxLength(50)
            .IsRequired();
        this.Property(c => c.AccountOwnerId)
            .HasColumnName("AccountOwner")
            .IsOptional();
        this.Property(c => c.DefaultExpensePartnerId)
            .HasColumnName("DefaultExpensePartner")
            .IsOptional();
        this.HasRequired(c => c.DefaultExpensePartner)
            .WithMany()
            .HasForeignKey(c => c.DefaultExpensePartnerId)
            .WillCascadeOnDelete(false);
        this.HasRequired(c => c.AccountOwner)
           .WithMany()
           .HasForeignKey(c => c.AccountOwnerId)
           .WillCascadeOnDelete(false);
    }
}
public class Users
{
    public int UserId { get; set; }
    public string Email { get; set; }
    public string DisplayName { get; set; }
    public string PasswordSalt1 { get; set; }
    public string PasswordSalt2 { get; set; }
    public string PasswordHash { get; set; }
}
public class UsersConfiguration : EntityTypeConfiguration<Users>
{
    public UsersConfiguration()
    {
        this.ToTable("Users");
        this.HasKey(c => c.UserId);
        this.Property(c => c.UserId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .IsRequired();
        this.Property(c => c.Email)
            .HasMaxLength(80)
            .IsRequired();
        this.Property(c => c.DisplayName)
            .HasMaxLength(50)
            .IsRequired();
        this.Property(c => c.PasswordSalt1)
            .HasMaxLength(172)
            .IsRequired();
        this.Property(c => c.PasswordSalt2)
            .HasMaxLength(172)
            .IsRequired();
        this.Property(c => c.PasswordHash)
            .HasMaxLength(40)
            .IsRequired();
    }
}

虽然我能够为AccountOwnerDefaultExpensePartner字段建立外键关系,但它们在数据库中被定义为非空,这是不正确的。有人知道如何将外键定义为可空的吗?

如何使用Fluent API定义可空的外键

如果你想有可空的外键,为什么你定义它为必需:

this.HasRequired

?

HasOptional代替:

        this.HasOptional(c => c.AccountOwner)
            .WithMany()
            .HasForeignKey(c => c.AccountOwnerId)
            .WillCascadeOnDelete(false);

您不必指定key-property,除非您真的想这样做,这就是代码优先的想法:)

根据微软的这篇文章,删除外键属性应该足够了。看看本文中的图1和图2之间的区别。(键当然会在数据库级别生成,但是您真的需要在模型中使用它们吗?)