0

まず第一に、私は Entity Framework の専門家ではありません。

そして、あるプロジェクトのリポジトリでいくつかのコードを見たことがあります。

  • エンティティの EntityReference プロパティを NULL にします
  • そして、その EntityReference の ID を保持します

このエンティティの変更を保存する前。

たとえば、Foo エンティティを保存する前に次の設定を行います。

if (foo.Bar !=null)
{
  foo.BarID = foo.Bar.ID;
  foo.Bar = null;
}

これは、 EntityReference プロパティを null にするという EntityFramework 関連の要件である可能性がありますが、保存するために ID のみを使用しますか?

4

2 に答える 2

1

そのコードは、データベースがBarエンティティに変更されないように記述する必要があります。

次の例を参照してください。

var foo = db.Foo.Include("Bar").First() // get some foo from db
foo.SomeColumn = "i have changed!";
var barId = foo.BarID; // get the "bar" id

foo.Bar.SomeColumn = "i have changed!"; // this will change the values from this column
db.SaveChanges(); // i will save changes from "bar" and from "foo", becouse "bar" was attached on get

そのコードでは、両方のエンティティの値を変更しましたが、コードがそれを防ごうとしている可能性があります。含めない場合は、Bar更新されません。

于 2013-01-15T18:10:05.243 に答える
1

いいえ、通常は必須ではありません。たとえば、添付されたエンティティを操作する場合、FK プロパティまたは参照を変更できます。両方とも機能します。

var foo = context.Foos.Include("Bar").Single(f => f.ID == 1);

それで...

foo.BarID = 5;
context.SaveChanges();

...動作し、...

var newBar = new Bar { ID = 5 };
context.Bars.Attach(newBar);
foo.Bar = newBar;
context.SaveChanges();

...も動作します。参照を無効にする必要はありません。

あなたの質問のコードは、おそらく意味があるでしょう

  • foo-関係はfoo.Bar矛盾/矛盾した状態にあります
  • そして、あなたは何が悪いのか知っています

例えば:

var foo = new Foo { ID = 1 };

foo.BarID = 4;
foo.Bar = new Bar { ID = 5 };

repo.UpdateFoo(foo);

そしてUpdateFoo、次のとおりです。

public void UpdateFoo(Foo foo)
{
    context.Foos.Attach(foo); // will throw an exception
    context.Entry(foo).State = EntityState.Modified;
    context.SaveChanges();
}

AttachFK値BarIDはある4が、参照foo.BarされているのはBar数値であるため、この行は例外をスローします5。EF は何が有効かを認識せず、Update の書き込みを拒否します。

UpdateFoo質問のコードをメソッドに追加することで、この問題を修正できます。

public void UpdateFoo(Foo foo)
{
    if (foo.Bar !=null)
    {
        foo.BarID = foo.Bar.ID;
        foo.Bar = null; // this line is not really necessary
    }

    context.Foos.Attach(foo); // no  exception anymore
    context.Entry(foo).State = EntityState.Modified;
    context.SaveChanges();
}

foo.Barただし、これは(ID = 5 の場合) が有効でfoo.BarID(ID = 4 の場合) が無効であるという前提に基づいています。

一般的に、これは必ずしも真実ではなく、逆の場合もあります。私の意見では、このスニペットは、実際には別のレイヤー (ビジネス レイヤーなど) で作成されたリポジトリ レイヤーの矛盾を修正しようとするコードの匂いです。

于 2013-01-15T18:55:11.780 に答える