如何自动更新审计列,包括导航属性?

时间:2015-06-17 11:59:56

标签: c# .net entity-framework

关于自动更新审计列有很多类似的问题,但它们对我不起作用,因为我还需要检测导航属性的变化。

目前,我在SaveChanges()调用了以下代码:

private void UpdateAuditDateTimeValues()
{
    DateTime currentDateTime = DateTime.Now;
    foreach (var change in Context.ChangeTracker.Entries().Where(
        x => x.State == EntityState.Added || x.State == EntityState.Modified))
    {
        var entityWithDate = change.Entity as BaseModelWithDate;
        if (entityWithDate != null)
        {
            if (change.State == EntityState.Added)
            {
                entityWithDate.CreatedDate = currentDateTime;
            }
            entityWithDate.ModifiedDate = currentDateTime;
        }
    }
}

但问题是如果我使用具有这样的导航属性的实体:

public class Lineup : BaseModelWithDate
{
    public int Id { get; set; }
    public Game Game { get; set; }
    public Player Player { get; set; }
    public string JerseyNumber { get; set; }
}

在游戏和玩家不同的情况下,如果我更改游戏或玩家属性,此代码无效。

如果我修改JerseyNumber(字符串)属性,它仍然可以正常工作。

所以问题是,如何修改UpdateAuditDateTimeValues()方法的代码,以便它还能检测游戏或播放器等导航属性的实体状态变化?

修改 这就是我在代码中分配属性的方法:

lineupEntity.Game = this.Uow.GetRepository<Game>().FindSingleLocal(x => x.GameKey == _xmlNode.GameKey);
lineupEntity.Player = this.Uow.GetRepository<Player>().FindSingleLocal(x => x.PlayerId == _xmlNode.PlayerId);
lineupEntity.JerseyNumber = _xmlNode.JerseyNumber;

如果Game已更改,但PlayerJerseyNumber没有更改,则无法检测到更改。

0 个答案:

没有答案