0

次の C# コードを見てください。複合キーを持つものを作成しようとしてClassCいますが、別のテーブルで外部キーとして使用できる ID も作成しようとしていますClassD。少し奇妙に思える複合キーをマップしようとする代わりに、この外部キーを使用したいと思います。

public class ClassA
{
    [Key]
    public int ClassAID { get; set; }
    public virtual ICollection<ClassC> SomeClassCs { get; set; }
}

public class ClassB
{
    [Key]
    public int ClassBID { get; set; }
    public virtual ICollection<ClassC> SomeClassCs { get; set; }
}

public class ClassC
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ClassCID { get; set; }

    [Key, Column(Order=0), ForeignKey("SomeA")]
    public int ClassAID { get; set; } //Foreign Keys combined as Primary Key

    [Key, Column(Order=1), ForeignKey("SomeB")]
    public int ClassBID { get; set; }

    public virtual ClassA SomeA { get; set; }
    public virtual ClassB SomeB { get; set; }

}

public class ClassD
{
    [Key]
    public int ClassDID { get; set; }

    [ForeignKey("SomeC")]
    public int ClassCID { get; set; }
    public virtual ClassC SomeC { get; set; }
}

移行を作成すると、次のエラーが表示されます。

System.Data.Entity.Edm.EdmAssociationConstraint: : 関係制約の従属ロールとプリンシパル ロールのプロパティの数は同じでなければなりません。

誰かがこれを解決しましたか、それとも私はこれに間違ってアプローチしていますか?

4

2 に答える 2

1

「少し奇妙に思える複合キーをマップしようとする代わりに、この外部キーを使用したい」

あなたは自然サロゲートキーについて話している

これが私がすることです:

  1. すべてのモデルで ID (代理) キーを使用する
  2. コンテキスト クラスで ValidateEntity をオーバーライドしてデータを検証する -エンティティ フレームワークでの重複を防ぐ
  3. 自然キーに一意のインデックスを追加する - 移行でインデックスを作成する

Entity Framework は、自然キーであるプロパティや一意のインデックスを持つ必要があるプロパティを識別するためのデータ注釈属性を提供していませんが、私が提供したリンクの回答を見ると、その目的のためにカスタム属性を作成する人がいることがわかります。

于 2013-09-11T14:35:02.923 に答える
0

依存エンティティの外部キーには、プリンシパルのすべての主キーが含まれている必要があります。外部キー制約の詳細については、TechNetを参照してください。

2 つの主キーがオンになっているため、このリレーションClassCには 2 つの外部キーが必要です。ClassDまたは、単一の主キーにすることもできます。そうすれば、外部キーClassCIDのマッピングが機能します。ClassDいずれの場合でも、従属テーブルの外部キーは、プリンシパル テーブルの主キーとまったく同じである必要があります。

于 2013-09-10T23:00:46.467 に答える