web-dev-qa-db-ja.com

HasForeignKeyによる1対0または1

私には2つのモデルがあります。

public class Person
{
    public virtual int Id { get; set; }
    public virtual Employee Employee { get; set; } // optional
}

public class Employee
{
    public virtual int Id { get; set; }
    public virtual int PersonId { get; set; }

    public virtual Person Person {get; set; } // required
}

public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
    public EmployeeConfiguration()
    {
        Property(e=>e.PersonId) // I need this property mapped
            .HasColumnName("person_id")
            .HasColumnType("int");
    }
}

流暢なマッピングを使用してそれらをマッピングしたいと思います。従業員テーブルには、null不可の列「person_id」があります。私は以下を試しました:

HasRequired(e => e.Person)
    .WithOptional(p => p.Employee)
    .Map(m => m.MapKey("person_id"));

しかし、それは失敗します:

System.Data.Entity.ModelConfiguration.ModelValidationException:モデル生成中に1つ以上の検証エラーが検出されました:

person_id:名前:タイプの各プロパティ名は一意である必要があります。プロパティ名 'person_id'は既に定義されています。

PersonIdプロパティだけが必要なので、基本的には次のようにします。

HasRequired(e => e.Person)
    .WithOptional(p => p.Employee)
    .HasForeignKey(e => e.PersonId); // there is no such method

しかしそのようなメソッドはありません HasForeignKeyとしてここに

31
joozek

OK、私はそれを理解しました-いくつかのプロパティに外部キーを格納するためにWithMany(そう、明白ではない)を使用する必要があります:

Property(e => e.PersonId).HasColumnName("person_id");
HasRequired(e => e.Person)
    .WithMany()
    .HasForeignKey(p => p.PersonId);

詳細は One-to-One Foreign Key Associations の記事を参照してください。ところで、これは個人のテーブルに従業員の外部キー列を作成しますが、ナビゲーションプロパティと外部キーを別々に持つ他の方法はありません。


外部キーを読み取り専用にする必要がある場合は、PersonIdプロパティを次のように変更できます。

public int PersonId { get { return Person.Id; } }

元のマッピングを使用します

HasRequired(e => e.Person)
    .WithOptional(p => p.Employee)
    .Map(m => m.MapKey("person_id"));
47

これを行うには実際にはもっと良い方法があります:

HasKey(e => e.PersonId);

HasRequired(e => e.Person)
    .WithOptional(p => p.Employee);

Employee.Idこのアプローチのプロパティ。最初は1対0または1の関係で不必要だったためです。

5
joelmdev