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 にする必要があります。
EDMX デザイナーで EF4 を使用してこれを達成するにはどうすればよいですか?
アップデート:
これは私が最終的に使用したものです:
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サーバー側ではなく、サービスサーバー側について話しています)