如何确定EF 4.1中具有引用属性的实体是否脏?

时间:2011-10-28 20:43:10

标签: entity-framework entity

似乎支持Entity.IsDirty应该很容易使用启用了自动更改跟踪(代理对象)的Entity Framework 4.1。但是,到目前为止,我还没有发现这种情况。

public class DomainContext : DbContext, IDomainContext
{

    /// <summary>
    /// Indicates whether changes have been made to the entity with that have 
    /// not been saved. This method assumes EF Proxies are being used for change tracking.
    /// </summary>
    /// <param name="entityId">The Id of the entity.</param>
    /// <returns>True if the entity is dirty, false otherwise.</returns>
    public bool HasChanges(Guid entityId)
    {
        foreach (DbEntityEntry entry in this.ChangeTracker.Entries())
        {
            IEntity entity = entry.Entity as IEntity;
            if (entity != null)
            {
                if (entity.Id == entityId && entry.State != System.Data.EntityState.Unchanged)
                {
                    return true;
                }
            }
        }
        return false;
    }
}

当对作为引用/复杂属性的实体的属性进行了更改时,上述方法似乎不起作用。例如:

public class UserPreferences : EntityBase
{

    /// <summary>
    /// Comma delimited list of AFEs for which the user is interested in viewing Events.
    /// </summary>
    public virtual string ViewableAFEs { get; set; }

    /// <summary>
    /// The primary operating area for the user. This is used for defaulting purposes.
    /// </summary>
    public virtual OperatingArea PrimaryOperatingArea
    {
        get { return _primaryOpArea; }
        set
        {
            if (_primaryOpArea != value)
            {
                _primaryOpArea = value;
                RaisePropertyChanged(() => PrimaryOperatingArea);
            }
        }
    }
}

如果我新建了上面的类,或从数据库中获取现有的UserPreferences实体,然后更改PrimaryOperatingArea属性,则DomainContext.HasChanges将返回false。我相信这是因为实体框架跟踪复杂和引用属性与值类型属性不同。

在调用上面的HasChanges方法时,更改ViewableAFEs属性(字符串)确实显示为更改。

我的问题是如何在我的派生DomainContext上公开一个泛型方法,它将评估所有属性(包括复杂,引用,集合类型)并确定实体是否是脏的?

我很好奇,让其他人使用EF 4.1杠杆EF用于IsDirty功能,或者你是否使用INotifyPropertyChanged等推出了自己的isDirty?

谢谢!

1 个答案:

答案 0 :(得分:3)

DbContext API已公开用于检查实体或某些属性是否已更改的选项。

  • 检查实体是否被修改:

    var myFooHasChanges = context.Entry(myFoo).State == EntityState.Modified;

  • 检查属性是否被修改:

    var barWasModified = context.Entry(myFoo).Property(u =&gt; u.Bar).IsModified;

您可以在Using DbContext in EF 4.1 Part 5: Working with Property Values

中阅读所有相关内容