Перезаписать методы DataContext в LINQToSQL - PullRequest
1 голос
/ 15 июня 2009

Я новичок в LINQToSQL. Есть ли способ перезаписать методы «InsertOnSubmit» или «DeleteOnSubmit» класса DataContext для конкретной сущности?

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

Один из способов сделать это - получить объект и вызвать метод Update (вместо Delete) после установки значения свойства. Это будет работать также, но просто из любопытства, я хочу знать, если стандартные методы DataContext (InsertOnSubmit, DeleteOnSubmit и т. Д.) Перезаписываются? И если да, то как?

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 июня 2009

Если вы хотите избежать дублирования имен пользователей в вашей базе данных, почему бы не поместить уникальный индекс в это поле?

0 голосов
/ 06 января 2014

я пока не тестирую, но думаю, может помочь вам

http://www.devart.com/linqconnect/docs/ExecuteDynamicMethods.html

0 голосов
/ 15 июня 2009

Насколько я знаю, нет, их нет. Если вы не хотите удалять это ... не звоните удалить! Тем не менее, некоторые другие варианты:

  • вы можете сопоставить удаление с хранимой процедурой, которая просто устанавливает флаг в базе данных
  • вы можете переопределить SubmitChanges и исправить любые изменения (через GetChangetSet) перед вызовом base.SubmitChanges - однако, я сомневаюсь, является ли это хорошей идеей; может потребоваться повторная вставка элемента, например.

Код:

partial class MyDataContext {
    public override void SubmitChanges(ConflictMode failureMode) {
        var delta = GetChangeSet();
        foreach(var record in delta.Deletes.OfType<Customer>()) {
            Customers.InsertOnSubmit(record);
            record.IsDeleted = true;
        }
        base.SubmitChanges(failureMode);
    }
}

Очевидно, что если он должен быть более гибким, вы можете использовать GetTable() (а не жесткое свойство Customers).


Обновления вашего комментария; Честно говоря, я не думаю, что вы можете сделать это в этот момент ; Что касается «10 мест» ... IMO, вы все равно должны скрывать контекст данных за интерфейсом хранилища, поэтому все 10 мест будут вызывать метод, подобный CreateUser, который имеет дело с контекстом данных и необходимой логикой (возможно, с отдельным классом бизнес-логики для обработки некоторых правил). Кроме того, уникальность обычно должна обрабатываться на уровне базы данных в любом случае (через ограничение) из-за проблем параллелизма.

Но чтобы сделать то, что вы хотите, прежде чем пытаться их сохранить:

partial class MyDataContext {
    public override void SubmitChanges(ConflictMode failureMode) {
        var delta = GetChangeSet();
        foreach(var record in delta.Inserts.OfType<User>()) {
            if(Users.Any(x=>x.Name == record.Name) {...throw an exception...}
        }
        base.SubmitChanges(failureMode);
    }
}
...