TryGetObjectByKey没有在.net 4.5中编译

时间:2012-09-28 20:04:15

标签: c# .net entity-framework

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

“MyEntities不包含'TryGetObjectByKey'的定义,并且没有扩展方法'TryGetObjectByKey'接受MyEntities类型的第一个参数(你是否缺少using指令或汇编引用?)”

据称,它是在System.Data.Objects命名空间中(因此我有一个使用它)来自引用的System.Data.Entity程序集(.dll)。

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

1 个答案:

答案 0 :(得分:4)

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

您始终可以使用((IObjectContextAdapter)db).ObjectContext.TryGetObjectByKey(...)来获取基础ObjectContext。