1

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

[服务]

    private static readonly ISomeDao someDao = DataAccess.SomeDao;
    [Query]
    public List<SomeEntity> 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<SomeEntity> SomeEntities
    {
        get { return _someEntity; }
        set
        {
            if (_someEntity!= value)
            {
                _someEntity= value;
                OnPropertyChanged("SomeEntities");
            }
        }
    }

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

4

1 回答 1

1

不使用 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); 行中

对于简单的属性,这些更改不会被记录(这些属性本身会发生变化,因此 EF 上下文知道如何 ApplyChanges 和更新数据库)。

可能的想法可能是:

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

希望这可以帮助!

于 2011-06-14T14:13:03.227 回答