如何在保存时自动更新Entity Framework 4中实体的Modified属性?

And*_*ita 6 .net c# entity-framework entity-framework-4 ef-model-first

我在VS2010,POCO和模型优先方法中使用EF4.

我的实体具有以下属性:Id:Guid,Name:String,Created:DateTime,Modified:DateTime,Revision:Int32.

我创建我的实体,设置名称并使用EF4上下文将其保存到数据库.这应该将Id设置为新的Guid(与Identity-SGP一起使用),Created设置为now,Modified left as null,Revision设置为0.我检索实体,更改名称并再次保存.这次Modified-value应设置为now,revision应为1.

如何使用EF4与EDMX设计师最好地完成此操作?

更新:

这是我最终使用的:

public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
    foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified).Where(e => e.Entity is EntityBase))
    {
        EntityBase entity = entry.Entity as EntityBase;
        if (entry.State == EntityState.Added)
        {
            entity.Version = new Version() { Major = 1, Minor = 0, Revision = 0 };
            entity.Created = DateTime.Now;
            if (OperationContext.Current != null) entity.CreatedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
        }
        else if (entry.State == EntityState.Modified)
        {
            entity.Version.Revision++;
            entity.Modified = DateTime.Now;
            if (OperationContext.Current != null) entity.ModifiedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
        }
    }

    return base.SaveChanges(options);
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用...... :(

问题是即使我明确地运行MarkAsModified()方法,entry.State仍然是未修改的.我不懂这个......

为什么默认情况下不启用更改跟踪?我使用自我跟踪实体,为什么我要把它关闭并每次明确地打开它?为什么即使状态未经修改,实体仍然持有db?那么EntityState和ObjectState之间的区别是什么?目前我正在进行所有更改并更新服务器端,但我也将使用WCF服务来回传输实体一段时间......这里如何处理更改有什么不同?如果服务器端的所有更改,无论是开启/关闭更改,都会持续存在?我想要的是,在没有更新Modified,Revision等的情况下,任何东西都不能存储.当收到对象并且已经更改时,应始终在服务器上设置这些属性.(我不是在这里讨论sql-server-side而是服务端服务器端)

Mor*_*avi 3

假设您的实体类型名称是 Product:

partial void OnContextCreated() {
    this.SavingChanges += Context_SavingChanges;
}

void Context_SavingChanges(object sender, EventArgs e) {

    IEnumerable objectStateEntries =
            from ose
            in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | 
                                                            EntityState.Modified)
            where ose.Entity is Product
            select ose;

    Product product = objectStateEntries.Single().Entity as Product;

    product.ModifiedDate = DateTime.Now;
    product.ComplexProperty.Revision++;
}
Run Code Online (Sandbox Code Playgroud)


如果您希望使用此代码来填充所有实体的公共字段(例如 ModifiedDate 或 ModifiedBy),请查看这篇文章:
Entity Framework - Auditing Activity

顺便说一句,StoreGeneratePatternConcurrencyMode与此无关,他们的目的是完全不同且不相关的。