Я использую EF4 в VS2010, POCO и подход, основанный на модели.
Моя сущность имеет следующие свойства: Id: Guid, Name: String, Created: DateTime, Modified: DateTime , Версия: Int32.
Я создаю свою сущность, устанавливаю имя и сохраняю ее в базе данных, используя EF4-контекст. Это должно установить для Id новый Guid (работает с Identity-SGP), Created set to 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 (). Я не понимаю этого ...
Почему по умолчанию не включено отслеживание изменений? Я использую объекты с самопроверкой, так зачем мне его выключать и каждый раз явно включать? И почему сущности сохраняются в db, даже если состояние не изменено? А в чем разница между EntityState и ObjectState? В настоящий момент я делаю все изменения и обновления на стороне сервера, но через некоторое время я также буду использовать WCF-сервис для передачи сущностей туда и обратно ... Есть ли разница в том, как здесь обрабатываются изменения? Если на сервере все изменения, независимо от включения / выключения отслеживания изменений, сохраняются ?? Я хочу, чтобы ничто не могло быть сохранено без обновления Modified, Revision и т. Д. Эти свойства всегда должны быть установлены на сервере, когда объект получен обратно и был изменен. (Здесь я говорю не о стороне сервера sql, а о стороне сервера)