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而是服务端服务器端)
假设您的实体类型名称是 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
顺便说一句,StoreGeneratePattern和ConcurrencyMode与此无关,他们的目的是完全不同且不相关的。
| 归档时间: |
|
| 查看次数: |
8148 次 |
| 最近记录: |