2009-07-27 3 views
1

У меня есть динамический dataWebsite, который использует SQL SP для выполнения операций по обновлению. У меня здесь проблема, моя функция удаления также является обновлением (установка IsDeleted = 1). В настоящее время я использую запрос LINQ и вызываю datacontext.SubmitChanges() для удаления. Проблема в том, что запрос LINQ обновления (который устанавливает IsDeleted = 1) при вызове SubmitChanges() также вызывает SP обновления, предназначенный только для операций обновления. Есть ли возможность запускать мой запрос LINQ непосредственно в БД вместо вызова SP обновления?LINQ help для сайта динамических данных

Employee ild = (from emp in _dataContext.Employee 
            where emp.IN_ID == int.Parse(ID) 
            select emp).FirstOrDefault(); 
ild.IsDeleted=1; 
_dataContext.Submitchanges(); 

Приведенный выше код всегда вызывает UpdateSP, который настроен на операцию обновления.

+0

Вы можете оставить свой код для нас, чтобы мы могли помочь вам> – StevenMcD

+0

Мягкие удаления - это гораздо более сложный дизайн, чем им предоставляется: http://weblogs.asp.net/fbouma/archive/2009/02 /19/soft-deletes-are-bad-m-kay.aspx –

ответ

0

Я не уверен на 100%, что я следую этой идее.

вообще удалить запись вы бы сказали:

_dataContext.Employee.remove(ild); 
_dataContext.Submitchanges(); 

Но, похоже, что вы хотели просто обновить запись, чтобы прочитать любой Enployee, который имеет параметр IsDeleted = 1 в качестве удаленной записи. При запуске кода, который у вас есть, есть сгенерированный оператор UPDATE, и поэтому UpdateSP будет запускаться.

Есть ли причина, по которой вы не можете использовать метод .remove() и исключить возможность удаления?

+0

Было деловым требованием не физически удалять строку – 2009-07-27 07:58:52

+0

Ах, тогда в этом случае мой ответ бесполезен. Извини за это! – StevenMcD

1

В этом случае вы могли бы использовать удаленный хранимый процесс, который будет вызван так же, как и ваш процесс обновления. Удаления прок не нужно на самом деле выполнить DELETE FROM таблицы запроса, но вместо того, чтобы можно было сделать обновление на базовой таблице установки IsDeleted флаг как соответствующий:

CREATE PROCEDURE 
    @Id int 
AS 
    UPDATE dbo.Employee 
    SET IsDeleted = 1 
    WHERE Id = @Id 

Вы бы затем сопоставить эту функцию для удаления, поведение в LINQ to SQL так же, как и метод Update. С этой опцией, ваш клиентский код будет делать простой Remove на столе, а не дело с IsDeleted флагом:

_dataContext.Employee.Remove(ild); 
_dataContext.SubmitChanges(); 

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

В качестве альтернативы опции «мягкое удаление» вы можете рассмотреть возможность включения таблицы Tombstone, которая мимизирует вашу транзакционную таблицу. В операции удаления используйте хранимую процедуру или триггер, чтобы переместить запись из таблицы транзакций в таблицу надгробий. При этом вы можете исключить флаг IsDeleted из базы данных и устранить необходимость включения фильтрации для всего доступа (включая отчетность).

+0

Вот как я вижу проблему. Просто ОБНОВЛЯЙТЕ столбец isDeleted и перейдите. –

Смежные вопросы