我在 VS2010、POCO 和模型优先方法中使用 EF4。
我的实体具有以下属性:Id:Guid、Name:String、Created:DateTime、Modified:DateTime、Revision:Int32。
我创建我的实体,设置名称并使用 EF4 上下文将其保存到数据库中。这应该将 Id 设置为新的 Guid(与 Identity-SGP 一起使用),Created 设置为 now,Modified 保留为 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);
}
哪个不起作用... :(
问题是即使我显式运行 MarkAsModified() 方法,entry.State 仍然未修改。我不明白这个...
为什么默认不启用更改跟踪?我使用自我跟踪实体,为什么我要关闭它并每次都明确打开它?为什么即使状态未修改,实体也会持久化到数据库?EntityState 和 ObjectState 有什么区别?目前,我在服务器端进行所有更改和更新,但一段时间后我还将使用 WCF 服务来回传输实体......这里如何处理更改有区别吗?如果服务器端的所有更改,无论更改跟踪开/关,都保持不变?我想要的是,如果不更新 Modified、Revision 等,任何东西都不应该被存储。当对象被接收回来并发生变化时,这些属性应该始终在服务器上设置。(我不是在说 sql-server-side 而是在 service-server-side)