Ric*_*zak 1 entity-framework-4 asp.net-mvc-2
我的控制器上有标准的Create()Edit()和Delete()方法,我正在使用EF4自跟踪实体.
当回发编辑时,model.ChangeTracker.ChangeTracking = false,以及model.ChangeTracker.State = ObjectState.Added,即使我确保在最初检索记录时设置了这些.
提交表单时,自我跟踪实体是否未持久保存ChangeTracker类?如果是这样,我该如何解决?
public virtual ActionResult Edit(int personId)
{
IContext context = ContextFactory.GetContext();
EntityRepo Repo = new EntityRepo(context);
Person d = Repo.Person.GetById(PersonId);
d.ChangeTracker.ChangeTrackingEnabled = true;
return View(d);
}
[HttpPost]
public virtual ActionResult Edit(int personId, Person item)
{
try
{
if (ModelState.IsValid)
{
IContext context = ContextFactory.GetContext();
EntityRepo Repo = new EntityRepo(context);
// the item is returning these properties that are wrong
//item.ChangeTracker.ChangeTrackingEnabled = false;
//item.ChangeTracker.State = ObjectState.Added;
Repo.Person.Update(item);
Repo.Person.SaveChanges();
return RedirectToAction("Index");
}
}
catch
{
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
让我们从头开始吧.
什么是自我跟踪实体,确切地说?
自我跟踪实体是即使没有连接到也可以进行更改跟踪的实体ObjectContext.当您必须更改实体但无法将其连接到实体时,它们非常有用ObjectContext.
那我什么时候想要一个,真的吗?
通常,当您必须具有分布式对象时.例如,一个用例是当您创建与Silverlight客户端通信的Web服务时.但是,其他工具,如RIA服务可能更适合这里.另一个可能的用例是长期运行的任务.由于ObjectContext旨在成为一个工作单元,并且通常不应该是长寿的,因此具有断开连接的实体可能在这里有意义.
他们对MVC有什么意义吗?
不是,不是.
让我们更深入地研究一下,并检查在MVC中更新实体时会发生什么.一般过程是这样的:
现在,您可以通过在HTML表单中包含STE的完整状态以及将其返回到MVC应用程序以及实体上的标量值来使自我跟踪实体工作.然后自我跟踪实体至少可以工作.
但这会给你带来什么好处呢?浏览器显然无法将您的实体作为C#对象处理.因此,它无法对自我跟踪实体理解的实体进行任何值得跟踪的更改.
| 归档时间: |
|
| 查看次数: |
1456 次 |
| 最近记录: |