2010-03-31 62 views
10

我有一個不可爲空的數據庫列,它有一個默認值集。插入一行時,有時會爲該列指定一個值,有時一個不是。當列被省略時,這在TSQL中工作正常。例如,如下表:LINQ-to-SQL可以在插入時省略未指定的列,以便使用數據庫默認值?

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。

我遇到的問題是當像這樣使用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(); 

如果COL1的自動生成的Value屬性爲False,第一行是根據需要創建的,但第二行失敗,col1上出現空錯誤。如果「自動生成的值」爲「真」,則兩行均使用數據庫的默認值創建。我嘗試過自動生成的值,自動同步和空值的各種組合,但沒有嘗試過我想要的行爲。

當沒有指定值時,L2S不會忽略插入語句中的列。相反,它做這樣的事情:

INSERT INTO Table1 (col1, col2) VALUES (null, '') 

......這當然會導致col1上的空錯誤。

如果沒有給定值,是否有某種方法讓L2S從插入語句中省略一列?還是有其他方式來獲得我想要的行爲?我需要數據庫級別的默認值,因爲並非所有行插入都是通過L2S完成的,在某些情況下,默認值比硬編碼值更復雜一些(例如,基於另一個字段創建默認值),所以我會而是避免重複該邏輯。

回答

7

不幸的是,LINQ到SQL不支持數據庫的默認值。看到這裏的第一個問題:

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

什麼他們的建議是您提供的插入方法有關實體的實現。簽名是

partial void Insert[EntityName](Entity instance) 

所以,如果你有所謂的人的實體,如果您想擁有的「家」的默認值的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

任何新的簡單修復? – Binny 2015-04-29 13:57:31

+0

@Binny如果可能的話,不要使用Linq-to-SQL,它是一種非常陳舊,過時並且不受支持的技術。不要將它和使用Linq與Entity Framework混淆,這應該可以很好地處理默認值。 – 2015-05-27 22:47:40

+0

未來我應該爲項目遵循哪些技術?有什麼建議麼?? – Binny 2015-05-28 14:53:01

-2

我不知道LINQ,但在SQL時,你需要有一個默認做任何一種方式:

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

INSERT INTO Table1 (col1, col2) VALUES (DEFAULT, 'X') 
+1

似乎沒有辦法告訴L2S使用默認值。 – 2010-03-31 18:43:56

相關問題