Мягкий Удаляет (столбец IsHistorical) с EntityFramework

Я работаю с базой данных, где разработчики решили отметить каждую таблицу со столбцом бита IsHistorical. Нет никакого соображения для надлежащего моделирования и нет никакого способа, которым я могу изменить схему.

Это вызывает некоторое трение при разработке экранов CRUD, которые взаимодействуют со свойствами навигации. Я не могу просто взять продукт и затем отредактировать его EntityCollection, я должен вручную выписать чеки IsHistorical повсеместно и его управление мной безумный.

Дополнения также ужасны, потому что до сих пор я выписал все ручные чеки, чтобы видеть, просто ли дополнение мягко удаленный так вместо того, чтобы добавить дублирующийся объект, я могу просто переключить IsHistoric.

Эти три возможности, которые я рассмотрел:

  1. Изменение t4 обрабатывает по шаблону для включения проверок IsHistorical и синхронизации.

  2. Удаления прерывания и дополнения в ObjectContext, переключают столбец IsHistorical и затем синхронизируют объектное состояние.

  3. Подпишитесь на событие AssociationChanged и переключите столбец IsHistorical там.

Кто-либо имеет опыт с этим или мог рекомендовать самый безболезненный подход?

Примечание: Да, я знаю, это плохо моделирует. Я читал, те же статьи о мягком удаляет это, Вы имеете. Это воняет, я должен иметь дело с этим требованием, но я делаю. Я просто хочу самый безболезненный метод контакта с мягким, удаляет, не пишущий тот же код для каждого свойства навигации в моей базе данных.

Примечание № 2 Ответ LukeLed технически корректен, хотя силы Вы в действительно плохих бедных укомплектовываете ORM, график меньше, шаблон. Проблема заключается в том теперь, что я обязан срывать все "удаленные" объекты от графика и затем называть Удалить метод по каждому. Это действительно не собирается сохранять меня так много ручного церемониального кодирования. Вместо того, чтобы выписать ручные чеки IsHistoric теперь я собираю удаленные объекты и цикличное выполнение через них.

9
задан John Farrell 22 December 2009 в 02:54
поделиться

2 ответа

Как я уверен, вы знаете, не будет хорошего решения этой проблемы, когда вы не можете изменить схему. Учитывая, что вам не нравится опция Repository (хотя, интересно, не поторопитесь ли вы ее отклонить), вот лучшее, что я могу придумать:

  1. Handle ObjectContext.SavingChanges
  2. When that event fires, tral through the ObjectStateManager looking for objects in the deleted state. Если у них есть свойство IsHistorical, установите его, и измените состояние объекта на измененное.

Это может быть сложно, когда речь идет об ассоциациях/отношениях, но я думаю, что это более или менее делает то, что вы хотите.

.
5
ответ дан 4 December 2019 в 15:20
поделиться

Я использую общий репозиторий в своем коде. Вы можете сделать это как:

public class Repository<T> : IRepository<T> where T : EntityObject
{
    public void Delete(T obj)
    {
        if (obj is ISoftDelete)
            ((ISoftDelete)obj).IsHistorical = true
        else
            _ctx.DeleteObject(obj);
    }

Ваш List() метод будет отфильтровывать и по IsHistorical. Интерфейс:

EDIT:

ISoftDelete:

public interface ISoftDelete
{
    bool IsHistorical { get; set; }
}

Классы сущностей могут быть легко помечены как ISoftDelete, так как они частичны. Определение частичного класса необходимо добавить в отдельный файл:

public partial class MyClass : EntityObject, ISoftDelete
{

}
8
ответ дан 4 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: