MVC 2和EF4自跟踪实体模型在回发时具有不良状态

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)

Cra*_*ntz 8

让我们从头开始吧.

什么是自我跟踪实体,确切地说?

自我跟踪实体是即使没有连接到也可以进行更改跟踪的实体ObjectContext.当您必须更改实体但无法将其连接到实体时,它们非常有用ObjectContext.

那我什么时候想要一个,真的吗?

通常,当您必须具有分布式对象时.例如,一个用例是当您创建与Silverlight客户端通信的Web服务时.但是,其他工具,如RIA服务可能更适合这里.另一个可能的用例是长期运行的任务.由于ObjectContext旨在成为一个工作单元,并且通常不应该是长寿的,因此具有断开连接的实体可能在这里有意义.

他们对MVC有什么意义吗?

不是,不是.

让我们更深入地研究一下,并检查在MVC中更新实体时会发生什么.一般过程是这样的:

  1. 浏览器发出更新页面的GET请求.
  2. MVC应用程序获取实体,并使用它来构建更新HTML页面.该页面将提供给浏览器,并且会处理大多数C#对象(包括您的实体).此时,您可以重新启动Web服务器,浏览器永远不会知道其中的区别.
  3. 浏览器发出POST请求以更新实体.
  4. MVC框架使用POST中的数据来实现传递给更新操作的编辑模型的实例.这可能与实体的类型相同,但它是一个新实例.
  5. MVC应用程序可以更新实体并将这些更改传递回数据库.

现在,您可以通过在HTML表单中包含STE的完整状态以及将其返回到MVC应用程序以及实体上的标量值来使自我跟踪实体工作.然后自我跟踪实体至少可以工作.

但这会给你带来什么好处呢?浏览器显然无法将您的实体作为C#对象处理.因此,它无法对自我跟踪实体理解的实体进行任何值得跟踪的更改.