似乎支持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?
谢谢!
答案 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
中阅读所有相关内容