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

.net LINQ to SQL是否可以在insert中省略未指定的列,以便使用数据库默认值?,.net,sql-server,visual-studio-2008,linq-to-sql,.net,Sql Server,Visual Studio 2008,Linq To Sql,我有一个不可为空的数据库列,它设置了默认值。插入行时,有时为列指定值,有时不指定值。当省略该列时,这在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 CLUSTERE

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

我遇到的问题是,在使用LINQtoSQL(L2S)和这样的表时。我想产生同样的行为,但我不知道如何让L2做到这一点。我希望能够运行以下代码,并让第一行获取我指定的值,第二行从数据库获取默认值:

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的Auto-Generated-Value属性为False,则会根据需要创建第一行,但第二行失败,并在col1上出现null错误。如果“自动生成的值”为True,则使用数据库中的默认值创建两行。我尝试了自动生成值、自动同步和可空的各种组合,但我没有尝试提供我想要的行为

当未指定任何值时,L2S不会从insert语句中忽略该列。相反,它是这样做的:

INSERT INTO Table1 (col1, col2) VALUES (null, '')
…这当然会导致col1上出现空错误


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

我不确定LINQ,但在SQL中,当您需要默认值时,请以任意一种方式执行:

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


不幸的是,LINQtoSQL不支持数据库默认值。请看这里的第一个问题:

他们建议您为所讨论的实体提供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());
    }
partial void InsertPerson(Person实例)
{
if(string.IsNullOrEmpty(instance.PhoneNumberDesc))
instance.PhoneNumberDesc=“Home”;
var insertParams=新列表();
var insertStatement=“插入…”;
//构建insert语句的其余部分并在此处填写参数值。。。
this.ExecuteQuery(typeof(Person)、insertStatement、insertParams.ToArray());
}
您可能可以实现OnCreated事件,该事件由每个实体的每个构造函数调用。本文简要介绍了Linq到SQL中的可扩展性点:


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

似乎没有办法告诉L2S使用默认值。@Binny如果可能,不要使用Linq to SQL,这是一种非常古老、过时且不受支持的技术。不过,不要将其与使用Linq和实体框架混淆,后者在默认值下应该可以很好地工作?有什么建议吗???@JeffSchumacher看起来EF也有同样的问题:
    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());
    }