2

我有以下代码可以很好地保存 .Net 4 / EF 4 项目中的分离对象。我想在新的 .Net 4.5 / EF 5 项目中使用该代码。我复制了它,现在它给了我一个编译错误:

“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 的回答,我只是将我的 Save 方法修改为如下所示,而不是创建一个采用 Detached 对象的 UpdateChanged 方法:

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 is a method on ObjectContext. Starting in Visual Studio 2012 new models will generate a DbContext based context by default (DbContext is designed to be a simpler and more intuitive API surface). Existing models will keep generating ObjectContext unless you choose to swap to DbContext. You can also revert back to ObjectContext for new models.

You can always get at the underlying ObjectContext using ((IObjectContextAdapter)db).ObjectContext.TryGetObjectByKey(...).

于 2012-10-01T16:52:26.490 回答