2010-04-30 5 views
3

Как я могу сделать свой собственный метод удаления, чтобы предотвратить фактическое удаление данных? Я хочу установить поле datetime, когда оно будет удалено вместо обычного удаления.Переопределить функцию удаления в структуре сущности

Я читал о переопределении функции SubmitChanges, но я не заставить его работать

ответ

4

Ручка SavingChanges, перейдите по удаленным элементам в контексте, измените их состояние на изменение и измените соответствующее поле.

+0

Хорошо, но как я могу настроить объект для изменения? objectstateentry.state только для чтения, я получил это до сих пор: еще если (entry.State == System.Data.EntityState.Deleted) { MyClass Ref = MyClass entry.Entity; Ref.SysDeleted = DateTime.Now; Ref.SysDeletedBy = Имя пользователя; } – k0ni

+0

С [Context.ObjectStateManager.ChangeObjectState] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.changeobjectstate.aspx) –

+0

Спасибо, но почему, черт возьми, У меня есть этот метод? «System.Data.Objects.ObjectStateManager» не содержит определения для «ChangeObjectState» – k0ni

0

Если вы не узнаете, как переопределить функцию удаления, вы можете создать ON DELETE триггер для каждой таблицы в базы данных, которая не удаляет, а устанавливает поле datetime.

+0

Я хочу обрабатывать все это на моем уровне доступа к данным – k0ni

1

Я написал интерфейс IRequiredColumns со свойствами CreatedOn, ModifiedOn и DeletedOn, которые реализует каждый объект. Затем я создал этот неполный класс для контекста:

Partial Public Class Context 
Public Overrides Function SaveChanges(ByVal options As System.Data.Objects.SaveOptions) As Integer 
    For Each entry As ObjectStateEntry In ObjectStateManager.GetObjectStateEntries(EntityState.Added Or EntityState.Modified Or EntityState.Deleted) 
     If TypeOf (entry.Entity) Is IRequiredColumns Then 
      Dim entity As IRequiredColumns = CType(entry.Entity, IRequiredColumns) 

      Select Case entry.State 
       Case EntityState.Added 
        entity.CreatedOn = Now 
       Case EntityState.Modified 
        entity.ModifiedOn = Now 
       Case EntityState.Deleted 
        entry.ChangeState(EntityState.Modified) 
        entity.DeletedOn = Now       
      End Select 
     End If 
    Next 

    Return MyBase.SaveChanges(options) 
End Function 
End Class 

Это отлично работает для меня!