1

コンテキストに既に読み込まれているエンティティを取得しようとしています。これはレガシー システムであるため、コンテキストの作成を変更できず (DbSet を介してアクセスできるようにするため)、ObjectSet API を介して作業する必要があります。

ObjectSet API の DbSet.Local プロパティに最も近いものは何ですか?

objectContext.GetObjectByKey(key)orのようなものを使用できるように見えますobjectContext.ObjectStateManager.GetObjectStateEntry(key)が、EntityKey の作成には、型とプロパティ名を文字列としてハードコーディングする必要があるようです。

var key = new EntityKey("MyEntities.Employees", "EmployeeID", 1);

より良い方法はありますか?

4

2 に答える 2

1

Gert と彼女の本 (「Programming Entity Framework」) によってリンクされた Julie Lerman のブログ投稿に基づくと、次のヘルパー メソッドを使用しているように見えます。

public class MyUnitOfWork : MyEntities 
{
    public IEnumerable<T> GetLocalObjects<T>() where T : class
    {
        var localObjects = ObjectStateManager
            .GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged)
            .Where(e => e.Entity is T)
            .Select(e => e.Entity as T);
        return localObjects;
    }
}

そして、次のように使用します。

_myUnitOfWork.GetLocalObjects<Employee>().First(x => x.EmployeeID == 1);
于 2013-06-27T16:51:45.783 に答える
1

または拡張メソッドとして上記:

public static IEnumerable<T> Local<T>(this ObjectSet<T> ObjectSet) where T : class
{
   var localObjects = ObjectSet.Context.ObjectStateManager
       .GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged)
       .Where(e => e.Entity is T)
       .Select(e => e.Entity as T);
   return localObjects;
}

使用法:

Row row = Context.MyObjectSet.Where(mos => mos.Key == key).FirstOrDefault();

if (row == null) // no row exists
{
    // see if the row exists in the Entity Cache
    row = Context.MyObjectSet.Local<MyObjectType>().Where(mos => mos.Key == key).FirstOrDefault();

    if (row == null)
    {
        row = new MyObjectType();  // no, so create a new one
        Context.MyObjectSet.AddObject(row);
    }
}
于 2014-02-04T21:34:06.820 に答える