web-dev-qa-db-ja.com

EFコードファースト-1対1のオプションの関係

EF Code Firstを使用して、既存のデータベースにオプションの1対1の関係をマップしたいと思います。

単純なスキーマ:

User
 Username
 ContactID

Contact
 ID
 Name

明らかに、ContactIDはContact.IDに結合します。 ContactIDフィールドはnull可能であるため、関係はオプションです-0または1、決して多くはありません。

では、この既存のスキーマを使用して、EF Code Firstでこの関係をどのように指定しますか?

これが私がこれまでに試したことです:

public class User
{
    [Key]
    public string Username { get; set; }
    public int? ContactID { get; set; }

    [ForeignKey("ContactID")]
    public virtual Contact Contact { get; set; }
}

public class Contact
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual User User { get; set; }
}

modelBuilder.Entity<User>().HasOptional<Contact>(u=> u.Contact)
    .WithOptionalDependent(c => c.User);

次の例外が発生します。

  System.Data.Edm.EdmAssociationEnd: : Multiplicity is not valid in Role
 'User_Contact_Source' in relationship 'User_Contact'. Because the Dependent 
Role properties are not the key properties, the upper bound of the multiplicity 
of the Dependent Role must be *.
26
Chris Moschini

1つの解決策は次のとおりです。

public class User
{
    [Key]
    public string Username { get; set; }

    public virtual Contact Contact { get; set; }
}

public class Contact
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }

    public virtual User User { get; set; }
}

        modelBuilder.Entity<User>()
            .HasOptional<Contact>(u => u.Contact)
            .WithOptionalDependent(c => c.User).Map(p => p.MapKey("ContactID"));

POCOにはナビゲーションオブジェクトのみを設定し、代わりにFluent APIを使用してキーを正しい列にマップします。

42
Per