У меня есть приложение, в котором данные таблицы базы данных будут добавлены только для приложений; то есть я могу только вставлять данные в базу данных, но никогда не обновлять и не удалять их. Я хотел бы использовать LINQ to SQL для его создания.Проектирование уровня доступа только для приложений с LINQ to SQL
Поскольку таблицы являются только приложениями, но мне все же нужно иметь возможность «удалять» данные, я считаю, что каждая таблица Foo
должна иметь соответствующую таблицу FooDeletion
. Таблица FooDeletion
содержит внешний ключ, который ссылается на Foo
, который был удален. Например, следующие таблицы описывают состояние «Foos 1, 2 и 3 существуют, но Foo 2 и Foo 3 были удалены».
Foo FooDeletion
id id fooid
---- -------------
1 1 2
2 2 3
3
Хотя я мог бы построить абстракции поверх слоя доступа к данным, которые (а) предотвращает прямой доступ к LINQ к объектам SQL и (б) управляет делеции таким образом, одна из моих целей, чтобы сохранить мой уровень доступа к данным как можно более тонкий, поэтому я предпочел бы, чтобы классы DataContext или сущности выполняли работу за кулисами. Итак, я хочу, чтобы вызывающие абоненты использовали Table<Foo>.DeleteOnSubmit()
, как обычно, и DAL знает, чтобы добавить строку в FooDeletion
вместо удаления строки из Foo
.
Я прочитал "Implementing Business Logic" и "Customizing the Insert, Update, and Delete Behavior of Entity Classes", но я не могу найти конкретный способ реализовать то, что я хочу. Я думал, что могу использовать метод DataContext.DeleteFoo(), чтобы вместо этого вызвать ExecuteDynamicInsert(FooDeletion), но в соответствии с this article: «Если вызывается неприменимый метод (например, ExecuteDynamicDelete для объекта, подлежащего обновлению), результаты не определены».
Является ли это безумным поручением? Я делаю это намного сложнее, чем мне нужно?
(a) это трюк, в котором я нуждался. Внутри моего объекта SubmitChanges я перечисляю обновления и удаления и делаю соответствующий перевод, а затем вызываю this.Refresh() или InsertOnSubmit(), чтобы отменить вставку. Благодаря! –
Hrm ... после игры, я думаю, что (c) лучший вариант, поэтому мне не нужно добавлять инфраструктуру «fail on delete» для каждого класса. Неважно, вы все равно получили правильный ответ. –