我有以下代码,可以很好地保存.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
答案 0 :(得分:4)
TryGetObjectByKey是ObjectContext上的一个方法。从Visual Studio 2012开始,新模型将默认生成基于DbContext的上下文(DbContext旨在成为更简单,更直观的API表面)。除非您选择交换到DbContext,否则现有模型将继续生成ObjectContext。您还可以revert back to ObjectContext获取新模型。
您始终可以使用((IObjectContextAdapter)db).ObjectContext.TryGetObjectByKey(...)来获取基础ObjectContext。