gpt4 book ai didi

.net - LINQ-to-SQL 是否可以在插入时省略未指定的列,以便使用数据库默认值?

转载 作者:行者123 更新时间:2023-12-02 09:37:52 26 4
gpt4 key购买 nike

我有一个不可为空的数据库列,它设置了默认值。插入行时,有时会为列指定一个值,有时则不会。当省略列时,这在 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 使用默认值。

我遇到的问题是在对这样的表使用 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 的“自动生成值”属性为 False,则会根据需要创建第一行,但第二行会失败,并在 col1 上出现空错误。如果“自动生成的值”为 True,则将使用数据库中的默认值创建两行。我尝试过自动生成值、自动同步和可为空的各种组合,但我尝试过的任何方法都无法提供我想要的行为。

当未指定值时,L2S 不会省略插入语句中的列。相反,它会执行如下操作:

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

...这当然会导致 col1 上出现空错误。

如果没有给出值,是否有某种方法让 L2S 从插入语句中省略一列?或者还有其他方法来获得我想要的行为吗?我需要数据库级别的默认值,因为并非所有行插入都是通过 L2S 完成的,并且在某些情况下,默认值比硬编码值稍微复杂一些(例如,基于另一个字段创建默认值),所以我而是避免重复该逻辑。

最佳答案

遗憾的是,Linq to SQL 不支持数据库默认值。请参阅此处的第一个问题:

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

他们建议您为相关实体提供 Insert 方法的实现。签名是

partial void Insert[EntityName](Entity instance)

因此,如果您有一个名为 Person 的实体,并且您希望 PhoneNumberDesc 字段具有默认值“Home”,则可以通过以下方式实现它:

    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

总而言之,这个解决方案确实有点糟糕。祝你好运!

关于.net - LINQ-to-SQL 是否可以在插入时省略未指定的列,以便使用数据库默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com