我有一個不可爲空的數據庫列,它有一個默認值集。插入一行時,有時會爲該列指定一個值,有時一個不是。當列被省略時,這在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完成的,在某些情況下,默認值比硬編碼值更復雜一些(例如,基於另一個字段創建默認值),所以我會而是避免重複該邏輯。
任何新的簡單修復? – Binny 2015-04-29 13:57:31
@Binny如果可能的話,不要使用Linq-to-SQL,它是一種非常陳舊,過時並且不受支持的技術。不要將它和使用Linq與Entity Framework混淆,這應該可以很好地處理默認值。 – 2015-05-27 22:47:40
未來我應該爲項目遵循哪些技術?有什麼建議麼?? – Binny 2015-05-28 14:53:01