Удалить сущность без загрузки сначала в Linq2SQL - PullRequest
4 голосов
/ 19 марта 2012

Я хочу удалить объект из базы данных, используя LINQ2SQL, без необходимости его предварительного извлечения (по соображениям производительности).

Я понимаю, что это можно сделать следующим образом ( Удалить запись LINQ to SQL, не загружая ее сначала ):

public void Delete(int id)
{
    var e = new TestEntity { Id = id };

    _context.TestEntities.Attach(e, false);
    _context.TestEntities.DeleteOnSubmit(e);
}

однако, когда TestEntity содержит дату и время, аналогичныеto:

public class TestEntity
{
    public int Id { get; set; }
    public String TestString { get; set; }
    public DateTime TestDate { get; set; }
    public int TestInt { get; set; }
}

Я получаю следующую ошибку:

SqlDateTime переполнение.Должен быть между 01.01.1753 12:00:00 и 31.12.9999 11:59:59 PM.

, что в основном означает, что он пытается проверить .net default datetime по отношению к SQLdatetime

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

* Заметьте, я также пытался установить фиктивное значение datetime в фиктивное, и в этом случае яполучить следующее:

Строка не найдена или изменена.

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

«Строка не найдена или изменена» предполагает, что у вас есть эти столбцы для проверки.Если у вас есть столбец отметки времени (rowversion), вы можете использовать это единственное значение для оптимистических проверок параллелизма, хотя, конечно, вы все равно не будете знать это значение.В некоторых случаях вы можете отключить проверки параллелизма полностью (установить UpdateCheck="Never" для всех интересных столбцов в базе данных).

Однако, возможно, более простой вариант:

_context.ExecuteCommand("delete from [TableName] where [PrimaryKey]={0}", id);

или что-то в этом роде.Не объектно-ориентированный, но очень эффективный.Обратите внимание, что это не выполняется в той же транзакции, что и SubmitChanges, если вы сами не управляете транзакцией, и что она не будет проверять, что ровно 1 строка была удалена.Но это прямо.Также обратите внимание, что контекст данных не будет знать об этом изменении, поэтому, если ваш контекст данных также имеет (скажем) ожидающие обновления для этой строки, он может запутаться.

0 голосов
/ 19 марта 2012

Попробуйте изменить

public DateTime TestDate { get; set; }

на

public DateTime? TestDate { get; set; }

И установить это поле в NULLable в таблице базы данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...