Может ли LINQ-to-SQL пропускать неопределенные столбцы при вставке, поэтому используется значение по умолчанию для базы данных? - PullRequest
11 голосов
/ 31 марта 2010

У меня есть необнуляемый столбец базы данных, для которого установлено значение по умолчанию. При вставке строки иногда для столбца указывается значение, иногда - нет. Это прекрасно работает в 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, а в некоторых случаях значение по умолчанию немного сложнее, чем жестко закодированное значение (например, создание значения по умолчанию на основе другого поля), поэтому я бы Избегайте дублирования этой логики.

Ответы [ 2 ]

7 голосов
/ 18 мая 2010

К сожалению, Linq to SQL не поддерживает значения по умолчанию для базы данных. Смотрите первый вопрос здесь:

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/3ae5e457-099e-4d13-9a8b-df3ed4ba0bab/

Они предполагают, что вы предоставляете реализацию метода Insert для рассматриваемой сущности. Подпись

* +1007 *

Итак, если у вас есть сущность с именем Person, для которой вы хотите иметь значение по умолчанию "Home" для поля PhoneNumberDesc, вы можете реализовать его следующим образом:

    partial void InsertPerson(Person instance)
    {
        if (string.IsNullOrEmpty(instance.PhoneNumberDesc))
            instance.PhoneNumberDesc = "Home";

        var insertParams = new List<object>();
        var insertStatement = "insert into ...";

        // build the rest of the insert statement and fill in the parameter values here...

        this.ExecuteQuery(typeof(Person), insertStatement, insertParams.ToArray());
    }

Возможно, вам удастся избежать реализации события OnCreated, которое вызывается с каждым конструктором для каждой сущности. В этой статье немного объясняется, как точки расширяемости в Linq To SQL: http://msdn.microsoft.com/en-us/library/bb882671.aspx

В общем, решение действительно отстой. Удачи!

0 голосов
/ 31 марта 2010

Я не уверен насчет LINQ, но в SQL, если вы хотите использовать значение по умолчанию, сделайте это так:

INSERT INTO Table1 (col2) VALUES ('X')  

или

INSERT INTO Table1 (col1, col2) VALUES (DEFAULT, 'X')  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...