2

分離天体を.Net4/EF4プロジェクトに保存するのに最適な次のコードがあります。そのコードを新しい.Net4.5/EF5プロジェクトで使用したかったのです。私はそれをコピーしました、そして今それは私に次のコンパイルエラーを与えます:

「MyEntitiesには「TryGetObjectByKey」の定義が含まれておらず、タイプMyEntitiesの最初の引数を受け入れる拡張メソッド「TryGetObjectByKey」が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)」

伝えられるところでは、参照されているSystem.Data.Entityアセンブリ(.dll)のSystem.Data.Objects名前空間にあります(したがって、これを使用しています)。

public bool UpdateChanged(IEntityWithKey DetachedObject = null) {
    bool Result = false;

    try {
        using (MyEntities db = new MyEntities()) {
            if (DetachedObject != null) {
                object Original = null;

                if (db.TryGetObjectByKey(DetachedObject.EntityKey, out Original))
                    db.ApplyCurrentValues(DetachedObject.EntityKey.EntitySetName, DetachedObject);
            } // if they want to Update an Entity

            db.SaveChanges();
            Result = true;
        } // using the database
    } catch (Exception e) {

    } // try-catch

    return Result;
} // UpdateChanged - Method

このリンクによると、動作するはずです:http: //msdn.microsoft.com/en-us/library/bb738728.aspx

手伝ってもらえますか?

更新/解決策:

以下の@Rowanの回答に基づいて、分離オブジェクトを受け取るUpdateChangedメソッドを作成する代わりに、Saveメソッドを次のようなものに変更しました。

using (MyEntities db = new MyEntities()) {
    if (o.ID > 0) {
        // Existing Owner
        db.Owners.Attach(o);
        db.Entry(o).State = EntityState.Modified;
        db.Entry(o.Address).State = EntityState.Modified;
    } else {
        // New Owner
        db.Owners.Add(o);
    } // if this is a New Owner

    db.SaveChanges();
} // using the database
4

1 に答える 1

4

TryGetObjectByKeyは、ObjectContextのメソッドです。Visual Studio 2012以降、新しいモデルはデフォルトでDbContextベースのコンテキストを生成します(DbContextは、よりシンプルで直感的なAPIサーフェスになるように設計されています)。DbContextにスワップすることを選択しない限り、既存のモデルはObjectContextを生成し続けます。新しいモデルのObjectContextに戻すこともできます。

((IObjectContextAdapter)db).ObjectContext.TryGetObjectByKey(...)を使用して、基になるObjectContextにいつでもアクセスできます。

于 2012-10-01T16:52:26.490 に答える