如何使用WCF Ria Services跟踪实体更改?

我需要将对客户端上发生的实体所做的更改记录到数据库表中。 但是,当我进行更改并检查ChangeTracker属性时,它声称没有发生任何更改。

[服务]

private static readonly ISomeDao someDao = DataAccess.SomeDao; [Query] public List GetSomeEntites(int someId) { var entities = someDao.GetSomeEntites(someId); entities.ForEach(e => e.StartTracking()); return entities; } [Update] public void UpdateSomeEntity(SomeEntity entity) { // inspect entity.ChangeTracker.OriginalValues.... nothing entity.StopTracking(); // inspect entity.ChangeTracker.OriginalValues.... nothing ... // Update log table } 

[客户]

  public EntitySet SomeEntities { get { return _someEntity; } set { if (_someEntity!= value) { _someEntity= value; OnPropertyChanged("SomeEntities"); } } } 

那么,如果自我跟踪实体和WCF Ria服务不能共存(这是我怀疑的),一个跟踪如何变化?

不要使用Ria服务,而只能使用WCF(不知道它是否有很大的不同……)。 首先,您不必执行命令(服务器端)来启动跟踪实体,这是通过WCF反序列化自动完成的。

 [OnDeserialized] public void OnDeserializedMethod(StreamingContext context) { IsDeserializing = false; ChangeTracker.ChangeTrackingEnabled = true; } 

其次,我知道只有在更改时才会记录SELF跟踪实体的主键和外键属性。 对于保持生活在实体环境中的NORMAL实体而言,情况并非如此(然后记录所有更改)。

如果您仔细查看自我跟踪实体,您可能会看到如下内容:

  [DataMember] public string Plaats { get { return _plaats; } set { if (_plaats != value) { _plaats = value; OnPropertyChanged("Plaats"); } } } private string _plaats; [DataMember] public int LandID { get { return _landID; } set { if (_landID != value) { ChangeTracker.RecordOriginalValue("LandID", _landID); if (!IsDeserializing) { if (Land != null && Land.ID != value) { Land = null; } } _landID = value; OnPropertyChanged("LandID"); } } } private int _landID; 

你看得到差别吗? 简单属性Plaats和外键属性LandID之间? 它位于`ChangeTracker.RecordOriginalValue(“LandID”,_ landID)行中;

对于简单属性,不会记录这些更改(属性itseklves是偏离路线更改的,因此EF上下文知道如何ApplyChanges并更新数据库)。

可能的想法可能是:

  1. 自定义T4模板以记录每个属性的原始值
  2. 从基类派生所有实体,您可以通过响应propertyChanged事件来放置一些用于记录原始值的框架
  3. 更新entites时,首先从数据库中获取原始值并跟踪更改

希望这可以帮助!