Я использую EF4 в VS2010, POCO и подход, ориентированный на модель.
Моя сущность имеет следующие свойства: Id:Guid, Name:String, Created:DateTime, Modified:DateTime, Revision:Int32.
Я создаю свою сущность, задаю имя и сохраняю ее в базу данных, используя EF4-контекст. Это должно установить Id на новый Guid (работает с Identity-SGP), Created установить на now, Modified left as null, Revision установить на 0. Я получаю объект, меняю имя и сохраняю его снова. На этот раз значение Modified должно быть установлено на now, а ревизия должна быть равна 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);
}
Который не работает... :(
Проблема в том, что entry.State по-прежнему не изменяется, даже если я явно запускаю метод MarkAsModified(). я не понимаю этого...
Почему отслеживание изменений не включено по умолчанию? Я использую самоотслеживающие объекты, так зачем мне их отключать и явно включать каждый раз? И почему сущности сохраняются в БД, даже если состояние не изменено? И в чем разница между EntityState и ObjectState? На данный момент я делаю все изменения и обновления на стороне сервера, но я также буду использовать WCF-сервис для передачи объектов туда и обратно через некоторое время... Есть ли разница в том, как здесь обрабатываются изменения? Если все изменения на стороне сервера, независимо от включения/выключения отслеживания изменений, сохраняются?? Я хочу, чтобы ничто никогда не могло быть сохранено без обновления Modified, Revision и т. д. Эти свойства всегда должны устанавливаться на сервере, когда объект возвращается и изменяется. (Здесь я говорю не о sql-сервере, а о сервис-сервере)