0

タイトルで述べたように、利用可能なメソッドはいくつありますか?

1 つの ObjectContext からエンティティ オブジェクトを取得し、エンティティ オブジェクトを OjbectContext オブジェクトから切り離して返します。

後で、このオブジェクトに変更を加えて、その変更をデータベースに保存したいとします。このように書くべきだと思いますよね?(まあ、これは私にとってはうまくいきます。)

public Url GetOneUrl()
{
    Url u;
    using(ServicesEntities ctx = new ServicesEntities())
    {
        u = (from t in ctx.Urls select t).FirstOrDefault<Url>();
        ctx.Detach(u);
    }
    return u;
}

public void SaveToDB(Url url)
{
   using(ServicesEntities ctx = new ServicesEntities())
   {
       var t = ctx.GetObjectByKey(_Url.EntityKey) as Url;
       ctx.Detach(t);
       ctx.Attach(url);
       ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified);
       ctx.SaveChanges();
   }
}

Url url = GetOneUrl();
url.UrsString = "http://google.com"; //I just change the content.
SaveToDB(url);

また

public void SaveToDB(Url url)
{
    using(ServicesEntities ctx = new ServicesEntities())
    {
        var t = ctx.GetObjectByKey(_Url.EntityKey) as Url;
        t = url; //this will make t.UrlString becomes "http://google.com"
        ctx.ApplyCurrentValues<Url>("Urls", t);
        ctx.SaveChanges();
    }
}

この方法は私にも有効です。

最初の方法では、SQL ステートメントを生成して Url テーブルのすべての列を更新しますが、2 番目の方法では、"UrlString" 列のみを更新する SQL スクリプトを提供します。

両方とも、データベースから一時エンティティ オブジェクトを取得する必要があります。これは、上記のコードの 't' です。

この目的を達成するための他の方法はありますか? または、それについて知っている他のより良い方法はありますか?または、このトピックに関する公式の解決策はありますか?

どうもありがとう。

4

1 に答える 1

0

最初の例がわかりません。最初に からエンティティを取得するのはなぜObjectContextですか? コンテキストの新しいインスタンスを作成したばかりなので、これは必要ありません。あなたはただ使うことができます:

public void SaveToDB(Url url)
{
   using(ServicesEntities ctx = new ServicesEntities())
   {
       ctx.Attach(url);
       ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified);
       ctx.SaveChanges();
   }
}

2番目の例では、次のように呼び出すことができます:

public void SaveToDB(Url url) 
{     
  using(ServicesEntities ctx = new ServicesEntities())     
  {         
     var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; // Ensures that old values are loaded
     ctx.ApplyCurrentValues<Url>("Urls", url);         
     ctx.SaveChanges();     
  } 
} 

これで、2 つのアプローチの違いが明確になりました。最初のアプローチ ( Attach) では、最初に DB にクエリを実行する必要はありません。2 番目のアプローチ ( ApplyCurrentValues) では、最初に DB にクエリを実行して古い値を取得する必要があります。

さらに 2 つの方法を使用できます。最初は、以前のアプローチの単なる拡張です。どのプロパティが変更されたかを定義できます。2 番目のアプローチは、読み込まれたエンティティとの手動同期です。このアプローチでは、特別な方法は使用しません。読み込まれたエンティティのプロパティを必要な値に手動で設定するだけです。EF は関係の変更を自動的に同期できないため、このアプローチは、単一のエンティティではなくオブジェクト グラフを使用する場合に役立ちます。

于 2011-02-07T09:07:13.230 に答える