1

Entity Frameworkに、特別な1対1の関係のために特定の方法でテーブルを作成させようとしています。

私がこのクラスのセットを持っているとしましょう:

public class Parent
{
    public int ID { get; set; }
    public string Title { get; set; }
    public Child XYZ { get; set; }
}

public class Child
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
}

クラスのXYZプロパティは、Parentのインスタンスに設定できます(MAY)Child。EFに2つのクラスのそれぞれのテーブルを作成してもらいたいのですが、オブジェクトのテーブルにChildは、オブジェクトとの関係を維持するために、理想的には「ParentID」という名前の外部キー列が必要ですParent

ChildParentテーブルに「ChildID」列が必要ありません。また、クラスにIDまたはParentIDプロパティを追加したくありません。

現在、Childオブジェクトのプロパティは親テーブルの列として作成されており、XYZプロパティがChildクラスのインスタンスに設定されていない場合、つまりnullにできない場合は、例外が発生します。

DbModelBuilderとOnModelCreatingイベントでこれを実行しようとしています。IsOptionalメソッドは、単純な型でのみ機能します。

助言がありますか?これはEFでも可能ですか?

4

2 に答える 2

2

現在、Childオブジェクトのプロパティは、Parentテーブルの列として作成されています。また、XYZプロパティがChildクラスのインスタンスに設定されていない場合、つまりnullにできない場合は、例外が発生します。

はい、現在Childは複合型(値オブジェクト)であり、常に設定する必要があるため、nullにすることはできません(エンティティの一部であり、この部分がないとエンティティは存在しません)。複合型のコンテンツがオプションの場合は、Childそれ自体ではなく、子のプロパティにこれを適用する必要があります。

IDまたはParentIDプロパティをChildクラスに追加したくありません。

すべてのエンティティに主キーが必要なため、個別のテーブルにChildマップする必要があります。そのIDは、1対1の関係を実現するためのID外部キーとしても使用されます。Parent

public class Child
{
    public int Id { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
}

そして関係マッピング:

modelBuilder.Entity<Parent>()
            .HasOptional(p => p.XYZ)
            .WithRequired();
于 2012-08-31T18:00:50.527 に答える
1

Entity Frameworkでは、同じ主キーを共有するために1対1の関係が必要です。つまり、子は親に対する外部キーを持っている必要があり、そのフィールドは子の主キーでもある必要があります。

あなたはそれが気に入らないかもしれませんが、EFは他の方法では機能しません。したがって、それを受け入れて先に進むか、別のフレームワークを見つけます。

于 2012-08-31T19:08:11.920 に答える