- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要设置 EntityObject 的 EntityKey。我知道它的类型和它的 id 值。我不想不必要地查询数据库。
这有效...
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
Model.EntityKey = (from Department d in db.Department
where d.Id == id
select d).FirstOrDefault().EntityKey;
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
这失败了...
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
String EntitySetName = db.DefaultContainerName + "." + Model.GetType().Name;
Model.EntityKey = new System.Data.EntityKey(EntitySetName, "Id", Model.Id);
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
ApplyPropertyChanges() 行因以下异常而失败:
The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'Sample.Models.Department'.
两个 EntityKey 是相等的。为什么第二个代码块会失败?我该如何解决?
最佳答案
第二个代码块失败的原因是因为 EF 无法在 ObjectStateManager 中找到对象 - 即当它从数据库中提取对象时,它会将它们放入状态管理器中以便它可以跟踪它们 - 这类似于Identity Map图案。尽管有 EntityKey,但您的对象不在状态管理器中,因此 EF 无法保留更改。您可以通过自己将对象放入状态管理器来解决这个问题,但您对此有点偷偷摸摸。
这个有效:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department model)
{
var entitySetName = db.DefaultContainerName + "." + model.GetType().Name;
var entityKey = new System.Data.EntityKey(entitySetName, "Id", model.Id);
db.Attach(new Department{Id = id, EntityKey = entityKey});
db.AcceptAllChanges();
db.ApplyPropertyChanges(entitySetName, model);
db.SaveChanges();
}
...但它不是很干净。基本上这是附加一个只有实体键的“空”对象,接受所有更改,然后使用实际的实际更新值调用 ApplyPropertyChanges。
这是一个扩展方法中包含的相同内容 - 这应该适用于使用单个 db 列作为主键的任何内容。调用该方法唯一有趣的部分是您需要告诉它如何通过委托(delegate)作为扩展方法的第二个参数来查找关键属性:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department model)
{
db.ApplyDetachedPropertyChanges(model, x => x.Id);
db.SaveChanges();
}
和扩展方法:
public static class EfExtensions
{
public static void ApplyDetachedPropertyChanges<T>(this ObjectContext db, T entity, Func<T, int> getIdDelegate)
where T : EntityObject
{
var entitySetName = db.DefaultContainerName + "." + entity.GetType().Name;
var id = getIdDelegate(entity);
var entityKey = new EntityKey(entitySetName, "Id", id);
db.Attach(new Department {Id = id, EntityKey = entityKey});
db.AcceptAllChanges();
db.ApplyPropertyChanges(entitySetName, entity);
}
}
由于扩展方法正在调用 AcceptAllChanges,因此如果同时对多个实体进行更新,则在调用此方法时需要小心——如果不小心,很容易“丢失”更新。因此这种方法只适用于简单的更新场景——例如很多 MVC 操作方法:)
关于c# - EntityKey 和 ApplyPropertyChanges(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/898260/
如何获取EntityKey的值? 我试过: String x = Customer.EntityKey.EntityKeyValues[0].Value; String x = Customer.En
有没有办法在不加载实体的情况下通过其 EntityKey 删除实体? 最佳答案 Tamir 的链接有效,但它使用了 Entity Framework 团队不再推荐的方法。 退房 this tip这更接
我正在使用断开连接的 Entity Framework 4 Object Context,感谢之前的一些很棒的帮助,我已经向前迈进了。 现在,我遇到了更多问题。似乎 EF 在执行简单的 CRUD 时似
我认为下面的代码非常有用。但我尝试创建 EntityKEy。我用过: EntityKey key = new EntityKey(entitySetKEYName, "XTableId", id);
我需要设置 EntityObject 的 EntityKey。我知道它的类型和它的 id 值。我不想不必要地查询数据库。 这有效... // // POST: /Department/Edit/5 [
是否可以在没有 EntityKey 的情况下 MemberwiseClone 从 ObjectContext 检索到的对象?我在 C# 中使用 Entity Framework 4.1 如果我尝试更改
难道我不能使用 DbEntityEntry 的复杂属性方法或属性方法来获取 EntityKey 对象吗?我找不到任何示例 MSDN ,但我认为这在 Entity Framework 5 中是可能的。我
我正在尝试以下列方式执行 EF 更新,但继续收到此错误: 只有当属性的当前值为 null 时,才能设置 EntityKey 属性。 using (hydraEntities db =
我正在使用 JSON.net 来序列化我的 EntityFramework 对象。 过去,我创建了一个将“JsonIgnore”属性应用于属性的类,然后将主 EntityFramework 类的“Me
作为表单发布的结果,我正在尝试保存新的品牌记录。在我看来,性别是一个下拉列表,返回一个整数,它是从 ViewData("gender") 填充的 我已经设置了我的链接如下: gID = CInt(Re
我如何为 Entity Framework 4 的实体获取第一个 EntityKey 名称,因为我正在构建一个存储库系统并且我想通过 Id 获取一个项目(这是主键 EF 是实体的第一个实体键) 我正在
我正在使用以下代码使用从我的代码中收集的新信息更新实体对象。我正在使用 Entity Framework 5。 我使用以下扩展方法(作为我过去在 EF4 中使用的重新附加代码的替代方法): publi
假设我在数据库中有一行我知道一个特定的 id(在我下面的示例中 - 一个 Id = 5 的符号),我可以创建一个 EntityObject 可以附加到另一个实体而无需加载它来自数据库(同样的场景也适用
我有一个可以重新调整 Entity Framework 对象的网络服务。在调用方,我除了读取信息之外不执行任何操作,因此不需要这些 Entity Framework 序列化属性。返回 Entity F
使用存储库模式在我的 Entity Framework 中执行“ObjectContext.Refresh(RefreshMode.StoreWins, entity)”时出现此错误。 我尝试在执行查
我已经尝试让 EF4 与 MVC 2 项目一起工作大约六个月了。这是一种折磨。尝试做任何不平凡的事情需要杂耍 EntityKeys,进行 ObjectContext Attach/Detach 舞蹈,
不确定标题是否有意义,但这就是我正在做的。我正在使用 AutoMapper 将我的 Entity Framework 实体映射到我的 DTO 对象,反之亦然。当我尝试将 DTO 数据映射到 EF 实体
在我的应用程序中,我有以下代码... public Boolean SaveUserInformation(UserInfoDTO UserInformation) {
我是一名优秀的程序员,十分优秀!