У меня есть необнуляемый столбец базы данных, для которого установлено значение по умолчанию. При вставке строки иногда для столбца указывается значение, иногда - нет. Это прекрасно работает в TSQL, когда столбец опущен. Например, с учетом следующей таблицы:
CREATE TABLE [dbo].[Table1](
[id] [int] IDENTITY(1,1) NOT NULL,
[col1] [nvarchar](50) NOT NULL,
[col2] [nvarchar](50) NULL,
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([id] ASC)
)
GO
ALTER TABLE [dbo].[Table1]
ADD CONSTRAINT [DF_Table1_col1] DEFAULT ('DB default') FOR [col1]
Следующие два утверждения будут работать:
INSERT INTO Table1 (col1, col2) VALUES ('test value', '')
INSERT INTO Table1 (col2) VALUES ('')
Во втором операторе значение по умолчанию используется для col1. * +1007 *
У меня проблема при использовании LINQ-to-SQL (L2S) с такой таблицей. Я хочу продемонстрировать то же поведение, но не могу понять, как заставить L2S сделать это. Я хочу иметь возможность запустить следующий код и получить в первой строке указанное мной значение, а во второй строке получить значение по умолчанию из базы данных:
var context = new DataClasses1DataContext();
var row1 = new Table1 { col1 = "test value", col2 = "" };
context.Table1s.InsertOnSubmit(row1);
context.SubmitChanges();
var row2 = new Table1 { col2 = "" };
context.Table1s.InsertOnSubmit(row2);
context.SubmitChanges();
Если свойство Auto Generated Value для col1 имеет значение False, первая строка создается по желанию, но вторая строка завершается ошибкой с нулевой ошибкой на col1. Если значение Auto Generated Value равно True, обе строки создаются со значением по умолчанию из базы данных. Я пробовал различные комбинации Auto Generated Value, Auto-Sync и Nullable, но ничего из того, что я пробовал, не дает желаемого поведения.
L2S не пропускает столбец из оператора вставки, если значение не указано. Вместо этого он делает что-то вроде этого:
INSERT INTO Table1 (col1, col2) VALUES (null, '')
... что, конечно, приводит к нулевой ошибке на col1.
Есть ли способ заставить L2S опустить столбец в операторе вставки, если значение не указано? Или есть какой-то другой способ получить поведение, которое я хочу? Мне нужно значение по умолчанию на уровне базы данных, потому что не все вставки строк выполняются через L2S, а в некоторых случаях значение по умолчанию немного сложнее, чем жестко закодированное значение (например, создание значения по умолчанию на основе другого поля), поэтому я бы Избегайте дублирования этой логики.