Принудить Entity Framework соблюдать ограничения, определенные в базе данных - PullRequest
1 голос
/ 08 марта 2019

У меня есть таблица с 10 столбцами, в которой 7 из них не равны NULL с ограничениями на нее.

ALTER TABLE [dbo].[MyTable] 
    ADD DEFAULT (1) FOR [Column1]

Теперь, когда я вставляю 3 столбца из Entity Framework, как показано ниже, он не вставляет значения по умолчанию в таблицу:

Table obj1 = new Table();
obj1.Column7 = someValue;
obj1.column8 = someValue;
obj1.column9 = someValue;
context.Entry(obj1).State = EntityState.Added;
context.SaveChanges(); 

В отличие от моих ожиданий, приведенное выше утверждение просто обновляет 3 столбца и не использует значения по умолчанию для остальных 7 столбцов.

Как я могу заставить Entity Framework вставлять значения по умолчанию, определенные ограничением в базе данных?

1 Ответ

1 голос
/ 08 марта 2019

Значения по умолчанию, определенные в структуре таблицы SQL Server, применяются только , если у вас есть оператор INSERT, который пропускает эти столбцы - например, не предоставляет никакого значения (включая NULL) для этих столбцов.

EF, однако, всегда будет предоставлять значения для всех столбцов, как определено сущностью - например, он предоставит NULL для любых значений, не установленных явно. Насколько я знаю, с этим ничего не поделаешь.

Есть несколько обходных путей:

  • вы можете создать хранимую процедуру , которая будет принимать только те значения, которые вы хотите указать, и выполнять оператор SQL INSERT, который пропустит столбцы со значениями по умолчанию, например

    INSERT INTO dbo.MyTable (colA, colB, ..., colZ)  -- *exclude* "Column1" here!
    VALUES ( .........)
    

    При этом SQL Server будет использовать настроенные значения по умолчанию для тех столбцов, для которых определен один столбец и которые не упомянуты в списке столбцов оператора INSERT INTO

  • вы, вероятно, могли бы сделать что-то похожее на уровне EF, указав второй класс, который будет почти идентичен вашему текущему классу сущности - но это пропустит столбцов, которые вы хотите установить в SQL Server настроенные значения по умолчанию. Если вы сохраните эту «уменьшенную» сущность, EF создаст оператор SQL, который будет включать только те столбцы , о которых он знает (в терминах полей этого уменьшенного класса), и это приведет в основном к то же, что и выше - оператор INSERT INTO, который исключает те столбцы, которые автоматически устанавливаются с помощью настроенного ограничения SQL Server по умолчанию

...