Я работаю с базой данных, где разработчики решили отметить каждую таблицу со столбцом бита IsHistorical. Нет никакого соображения для надлежащего моделирования и нет никакого способа, которым я могу изменить схему.
Это вызывает некоторое трение при разработке экранов CRUD, которые взаимодействуют со свойствами навигации. Я не могу просто взять продукт и затем отредактировать его EntityCollection, я должен вручную выписать чеки IsHistorical повсеместно и его управление мной безумный.
Дополнения также ужасны, потому что до сих пор я выписал все ручные чеки, чтобы видеть, просто ли дополнение мягко удаленный так вместо того, чтобы добавить дублирующийся объект, я могу просто переключить IsHistoric.
Эти три возможности, которые я рассмотрел:
Изменение t4 обрабатывает по шаблону для включения проверок IsHistorical и синхронизации.
Удаления прерывания и дополнения в ObjectContext, переключают столбец IsHistorical и затем синхронизируют объектное состояние.
Подпишитесь на событие AssociationChanged и переключите столбец IsHistorical там.
Кто-либо имеет опыт с этим или мог рекомендовать самый безболезненный подход?
Примечание: Да, я знаю, это плохо моделирует. Я читал, те же статьи о мягком удаляет это, Вы имеете. Это воняет, я должен иметь дело с этим требованием, но я делаю. Я просто хочу самый безболезненный метод контакта с мягким, удаляет, не пишущий тот же код для каждого свойства навигации в моей базе данных.
Примечание № 2 Ответ LukeLed технически корректен, хотя силы Вы в действительно плохих бедных укомплектовываете ORM, график меньше, шаблон. Проблема заключается в том теперь, что я обязан срывать все "удаленные" объекты от графика и затем называть Удалить метод по каждому. Это действительно не собирается сохранять меня так много ручного церемониального кодирования. Вместо того, чтобы выписать ручные чеки IsHistoric теперь я собираю удаленные объекты и цикличное выполнение через них.
Как я уверен, вы знаете, не будет хорошего решения этой проблемы, когда вы не можете изменить схему. Учитывая, что вам не нравится опция Repository (хотя, интересно, не поторопитесь ли вы ее отклонить), вот лучшее, что я могу придумать:
ObjectContext.SavingChanges
ObjectStateManager
looking for objects in the deleted state. Если у них есть свойство IsHistorical
, установите его, и измените состояние объекта на измененное.Это может быть сложно, когда речь идет об ассоциациях/отношениях, но я думаю, что это более или менее делает то, что вы хотите.
.Я использую общий репозиторий в своем коде. Вы можете сделать это как:
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
{
}