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 *.
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を使用してキーを正しい列にマップします。