5

私は2つのテーブルを持っています -

 1. Account 

 2. Users

AccountテーブルでDefaultExpensePartnerは、テーブルのフィールドのAccountOwner外部キーです。以下のようにクラスを定義しました。UserIdUsers

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();
    }
}

AccountOwnerフィールドとフィールドの外部キー関係を確立することはできDefaultExpensePartnerますが、データベースでは null 以外として定義されており、当初の計画では正しくありません。外部キーをnull可能として定義する方法を知っている人はいますか?

4

2 に答える 2

16

null 許容の外部キーが必要な場合、それを必須として定義するのはなぜですか。

this.HasRequired

?

HasOptional代わりに使用してください:

        this.HasOptional(c => c.AccountOwner)
            .WithMany()
            .HasForeignKey(c => c.AccountOwnerId)
            .WillCascadeOnDelete(false);
于 2013-01-16T13:30:19.187 に答える
3

本当に必要でない限り、キープロパティを指定する必要はありません。これは、最初にコードの考え方です:)

Microsoft のこの記事によると、外部キー プロパティを削除するだけで十分なはずです。記事の図 1 と図 2 の違いを見てください。(キーはもちろんデータベース レベルで生成されますが、モデルで本当に必要ですか?)

于 2013-01-16T13:18:25.030 に答える