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

标签 entity-framework entity

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

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。我相信这是因为 Entity Framework 以不同于值类型属性的方式跟踪复杂和引用属性。

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

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

我很好奇,你们中的其他人是否使用 EF 4.1 利用 EF 实现 IsDirty 功能,或者你们是否通过使用 INotifyPropertyChanged 等推出了自己的 isDirty?

谢谢!

最佳答案

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

  • 检查实体是否被修改:

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

  • 检查属性是否被修改:

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

您可以在以下位置阅读所有相关信息:Using DbContext in EF 4.1 Part 5: Working with Property Values

关于entity-framework - 如何确定 EF 4.1 中具有引用属性的实体是否脏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7934703/

相关文章:

sql - 创建 View ,选择列作为主键

c# - 在快速增长的 SQL Server 数据库表中搜索最新数据

c# - 通过 ID 查找继承的对象 - Entity Framework

entity-framework - Entity Framework 多对多映射上的软删除

NHibernate 等效于 Entity Framework DbSet.Local 用于未刷新的实体?

java - "Remove"对分离实体的操作

entity-framework - Entity Framework 代码优先映射如何反射(reflect)域驱动设计?

mysql - 从实体类生成的 Facelet 中带注释的 SQL 变量

c# - ObjectContext 实例已被处置,不能再使用

c# - 如果我处置我的 ObjectContext,我的实体是否分离?