エンティティフレームワーク4.1外部キー列として主要なキーを持つテーブルへの最初のマッピングコード
-
25-10-2019 - |
質問
最初にエンティティフレームワークコードを使用してマッピングする既存のデータベースがあります。列の命名規則は奇妙なので、エンティティのプロパティを手動でマップすることにしましたが、今までこれは問題ありませんでした。
データベースのスキーマは私にとって非常に奇妙であり、間違いなく私がそれをやった方法ではありません。残念ながら、私はそれに固執しています。
基本的に、多くのテーブルで共有される単一の主キー(accountnumber)があり、1対1の関係の束を作成します。ただし、主キーは外部キー列でもあります。私のエンティティがどのように見えるか(簡単にするためにたくさんのプロパティが削除されました)。簡単にするために2つのエンティティしか含まれていません。
public class Customer
{
public int AccountNumber { get; set; }
public String PhoneNumber { get; set; }
...
public virtual Address Address { get; set; }
}
public class Address
{
public int AccountNumber { get; set; }
public String Name { get; set; }
public String Address1 { get; set; }
public String City { get; set; }
...
public virtual Customer Customer { get; set; }
}
2つのエンティティは同じ主キーを共有しています。このようなマッピングを行うために構成クラスを作成しました。
public class CustomerConfiguration : EntityTypeConfiguration<Customer>
{
public CustomerConfiguration()
: base()
{
HasKey(p => p.AccountNumber);
Property(p => p.AccountNumber).
HasColumnName("cm_l_acct").
IsRequired();
Property(p => p.PhoneNumber).
HasColumnName("cm_s_phonenumber");
HasRequired(x => x.Address).
WithRequiredPrincipal(x => x.Customer).
Map(x => x.MapKey("am_l_acct"));
}
}
public class AddressConfiguration : EntityTypeConfiguration<Address>
{
public AddressConfiguration()
: base()
{
HasKey(p => p.AccountNumber);
Property(p => p.AccountNumber).
HasColumnName("am_l_acct").
IsRequired();
...
}
}
外部キーマッピングは、片側でのみ行われます。これは、外部キー列がテーブルの主要なキーでもあるという事実ではないにしても機能するように見えます。クエリを実行しようとすると、エラーが表示されます。
(256,6):エラー0019:タイプの各プロパティ名は一意でなければなりません。プロパティ名「AM_L_ACCT」はすでに定義されています。
残念ながら、AccountNumberプロパティのマッピングをアドレスエンティティから引き出すことはできません。これは主要なキーであるためです。
このマッピングを達成できる方法はありますか、それとも不可能ですか?
解決
これを取り外します Map(x => x.MapKey("am_l_acct"))
あなたから Customer
マッピング。このマッピングは、データベースにFK列を定義する必要があり、クラスにFKプロパティを持っていないが、それがある場合にのみ使用されます。 Address
実在物。そのようにFKをマッピングしようとすると、EFは、同じ名前の列に作成しようとしていると考えています。