我们在EntityFramework中实现了工作单元,因此当我们使用ObjectContext并对实体进行任何更改时,它会被跟踪,然后在SaveChanges上它会全部反映在底层数据库中。
但是,如果我想跟踪自定义类的更改,那么每个修改都会被跟踪并通过webservice调用发送?
我有webservice,它为我提供了一些数据,数据显示在datagrid中,然后可以修改。我希望跟踪所有更改,然后能够通过webservice发回仅已修改的数据。有没有像EntityFramework或POCO那样的解决方案?或者我必须为它实现我自己的工作单元模式?
答案 0 :(得分:1)
仅当实体附加到上下文时,更改跟踪才有效。有一种特殊类型的实体称为Self tracking entities,它能够在使用Web服务公开时跟踪客户端的更改,但这些类仍然是您的主要实体(不是自定义对象),并且它们将跟踪状态直接应用于上下文。
您所描述的与工作单元模式无关。您正在寻找能够仅将差异传递回服务的更改集模式。这些类的实现完全取决于您。 .NET不提供它们。 .NET提供了两种变更集模式的实现
这两个实现都默认传输所有数据(此外,至少DataSet在消息中默认具有旧状态和新状态)。数据集和STE都有相同的限制 - 它们是very badly interoperable。
答案 1 :(得分:0)
由于各种原因,不应将属性级别的更改跟踪留给WCF调用的客户端。如果使用DTO(数据传输对象)模式,则应该能够保持单个对象足够小,以避免在整个线路上发送整个更改对象时产生任何重大开销。然后,在服务器端,从数据库中加载对象的当前版本,设置DTO提供的值,并让实体框架跟踪更改的属性。
public SavePerson(Person person)
{
using(var context = _contextFactory.Get())
{
var persistentPerson = context.People.Single(p => p.PersonId == person.PersonId);
persistendPerson.FirstName = person.FirstName;
/// etc. (This could be done with a tool like AutoMapper)
context.SaveChanges();
}
}
如果您在客户端更改多个对象,并且想要跟踪用户已更改的对象,则可以让客户端负责跟踪更改的对象并仅发送这些对象批量访问Web服务。在那里,您可以应用相同的模式并等待SaveChanges直到所有对象都已更新。
希望这有帮助。