0

エンティティ間にオプションの関係を作成しようとしていますが、正しい構文を見つけるのに苦労しています。実際には 0..1 から 0..2 への関係が必要ですが、0..1 から 0..1 への変換方法を見つけたら、それは簡単なことだと思います。

私が持っているものを簡略化すると、次のようになります。

class Foo
{
    int Id { get; set; }
    //navigation property
    virtual Bar Bar { get; private set; }
}

class Bar
{
    int Id { get; set; }

    int? LeftFooId { get; set; }
    [ForeignKey("LeftFooId")]
    Foo LeftFoo { get; set; }

    int? RightFooId{ get; set; } 
    [ForeignKey("RightFooId")]
    Foo RightFoo { get; set; }
}

Foo は 0 個または 1 個の Bar に接続できますが、それ以上接続することはできません。Bar には、LeftFoo と RightFoo を含めるか、どちらかを含めるか、両方とも含めることができます。Foo の Bar プロパティは、Bar によって参照されていない場合は null である必要があり、Bar によって参照されている場合はそれを参照する Bar が含まれている必要があります。

上記のコードでは、Bar は Foo を正しく参照しますが、EF は Foo テーブルに Bar_Id を与え、Bar プロパティは常に null です。

これらのエンティティ クラスをセットアップするためにいくつかの異なる方法を試しましたが、別の Fluent API 呼び出しを使用してこれを機能させましたが、必要な結果が得られません。

4

3 に答える 3

0

プロパティを仮想化し、POCO プロキシを使用してみてください (new ... の代わりに Create を使用)。これにより、サイド プロパティの自動更新が保証されます。つまり、Foo を Bar に割り当てると、POCO プロキシは対応する Bar を Foo に割り当てますが、これが主な問題になるはずです: Bar を Foo に割り当てるとどうなるでしょうか? 自動的に割り当てたいプロパティは、左右どちらですか? Bar プロパティ [InverseProperty("...")] に注釈を付けてこれを示し、他の関係のために Foo のタイプ Bar の別のプロパティが必要になる可能性があると考えてください。お役に立てれば

于 2015-02-24T13:50:27.297 に答える
0

次のようにコードを変更しました。

class Foo
{
    int Id { get; set; }
    int? BarId { get; set; }
    [ForeignKey("BarId")]
    virtual Bar Bar { get; set; }
}

class Bar
{
    int Id { get; set; }

    int? LeftFooId { get; set; }
    [ForeignKey("LeftFooId")]
    Foo LeftFoo { get; set; }

    int? RightFooId{ get; set; } 
    [ForeignKey("RightFooId")]
    Foo RightFoo { get; set; }
}

私は間違っているかもしれませんが、少なくとも Foo から Bar への FK のペアの自動割り当ては不可能です。したがって、今のところ、両方の割り当てを手動で行っています。

Foo myFirstFoo = new Foo();
Foo mySecondFoo = new Foo();
Bar myBar = new Bar();
context.Add(myFirstFoo); context.Add(mySecondFoo); context.Add(myBar);
context.SaveChanges();
myFirstFoo.BarId = myBar.Id;
myBar.LeftFooId = myFirstFoo.Id;
mySecondFoo.BarId = myBar.Id;
myBar.RightFooId = mySecondFoo.Id;
context.Update(myFirstFoo); context.Update(mySecondFoo); context.Update(myBar);
context.SaveChanges();

これはうまくいくように見えますが、もっとうまくできることを願っています。

于 2013-07-24T14:40:03.290 に答える