【问题标题】:TryGetObjectByKey not compiling in .net 4.5TryGetObjectByKey 未在 .net 4.5 中编译
【发布时间】:2012-09-28 20:04:14
【问题描述】:

我有以下代码可以很好地保存 .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

【问题讨论】:

  • MyEntitiesObjectContext 的子类吗?
  • MyEntitiesdb 的类型)被视为第一个参数,所以这看起来像是你在某个地方找到的扩展方法。
  • 为了让Brian 的问题更清楚——MyEntities 是派生自ObjectContext 还是DbContext?你能展示一下它的样子吗?
  • @BrianRasmussen,MyEntities 派生自 DbContext。

标签: c# .net entity-framework


【解决方案1】:

TryGetObjectByKey 是 ObjectContext 上的一个方法。从 Visual Studio 2012 开始,新模型将默认生成基于 DbContext 的上下文(DbContext 被设计为更简单、更直观的 API 界面)。除非您选择交换到 DbContext,否则现有模型将继续生成 ObjectContext。您也可以revert back to ObjectContext 获取新型号。

您始终可以使用 ((IObjectContextAdapter)db).ObjectContext.TryGetObjectByKey(...) 获取底层 ObjectContext。

【讨论】:

  • 谢谢@Rowan,成功了。有了这个新的 DbContext,有没有更好/不同的方法来连接断开的对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多