C# linq到sql是否插入已存在的唯一行?

C# linq到sql是否插入已存在的唯一行?,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,如果插入已存在且具有唯一列的行,会发生什么情况?它是以静默方式失败还是更新记录?如果它更新了存在的行,有没有办法让它失败?还是我一直在使用select首先检查行?您将得到一个由后端sql server生成的异常。您将得到一个由后端sql server生成的异常。//编辑:我更新了代码以符合您的要求。在SQL Server中,请确保表主键列是seed和increment都设置为1的标识列。 当您尝试提交类时,不要添加主键。它将自动使用这个 如果尝试将行插入到具有相同唯一ID的表中,将引发异常。Li

如果插入已存在且具有唯一列的行,会发生什么情况?它是以静默方式失败还是更新记录?如果它更新了存在的行,有没有办法让它失败?还是我一直在使用select首先检查行?

您将得到一个由后端sql server生成的异常。

您将得到一个由后端sql server生成的异常。

//编辑:我更新了代码以符合您的要求。在SQL Server中,请确保表主键列是seed和increment都设置为1的标识列。 当您尝试提交类时,不要添加主键。它将自动使用这个

如果尝试将行插入到具有相同唯一ID的表中,将引发异常。Linq to Sql中的更新非常棘手。。。请参阅下面的代码。第一部分将失败,但将在try-catch中捕获。第二部分是如何进行更新。您必须根据主键将其拉出,更改字段,然后提交。请参阅此博客:

类程序
{
静态void Main(字符串[]参数)
{
DataClasses1DataContext ctx=新DataClasses1DataContext();
尝试
{
对于(int i=0;i<10;i++)
{
ctx.表1.InsertOnSubmit(新表1
{
Name=“约翰”
});
提交更改(System.Data.Linq.ConflictMode.FailOnFirstConflict);
}
var list=来自ctx.Table_1s中的i
选择i;
foreach(列表中的变量项)
{
Console.WriteLine(项目名称);
}
}
捕获(例外e)
{
控制台写入线(e.Message);
}
//输出:“John”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
}
}

//编辑:我更新了代码以满足您的需要。在SQL Server中,请确保表主键列是seed和increment都设置为1的标识列。 当您尝试提交类时,不要添加主键。它将自动使用这个

如果尝试将行插入到具有相同唯一ID的表中,将引发异常。Linq to Sql中的更新非常棘手。。。请参阅下面的代码。第一部分将失败,但将在try-catch中捕获。第二部分是如何进行更新。您必须根据主键将其拉出,更改字段,然后提交。请参阅此博客:

类程序
{
静态void Main(字符串[]参数)
{
DataClasses1DataContext ctx=新DataClasses1DataContext();
尝试
{
对于(int i=0;i<10;i++)
{
ctx.表1.InsertOnSubmit(新表1
{
Name=“约翰”
});
提交更改(System.Data.Linq.ConflictMode.FailOnFirstConflict);
}
var list=来自ctx.Table_1s中的i
选择i;
foreach(列表中的变量项)
{
Console.WriteLine(项目名称);
}
}
捕获(例外e)
{
控制台写入线(e.Message);
}
//输出:“John”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
//“约翰”
}
}

过危险的生活,试一试,让我们知道会发生什么!;)老实说,这通常是最好的办法。如果它是一个活动数据库,那么只需在某处插入一个临时虚拟记录,然后尝试插入另一个。LinqPad在这里是无价之宝。它在运行时会失败并抱怨-尝试一下?生活危险,尝试一下,让我们知道会发生什么!;)老实说,这通常是最好的办法。如果它是一个活动数据库,那么只需在某处插入一个临时虚拟记录,然后尝试插入另一个。LinqPad在这里是非常宝贵的。它会在运行时失败并抱怨-尝试一下?它可能只是sqlite,但没有引发异常。它可能只是sqlite,但没有引发异常。没有引发异常,除非我尝试插入它两次,然后我在跟踪程序中得到一个重复的密钥异常,我不确定它是否相关。可以吗是否确认表中的主键是种子值为1、增量值为1的标识列?如果是,则不必为主键插入值,它将自动递增。该表既有一个自动递增的主键,也有一个唯一的文本字段。自动递增列正在正确递增。尽管存在重复的unique,但它仍然不会引发异常。如果代码中的主键是具有自动递增+1且种子值为1的identity主键,则Linq-To-Sql将忽略为该主键设置的任何值。试试我的桌子。。。使用上面示例中的代码,然后选择所有行,将不会有重复的主键。因此,没有引发异常:使用[db_dtsos]GO/*******对象:表[dbo]。[Table_1]脚本日期:08/10/2011 09:33:53******/SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE Table[dbo]。[Table_1]([PrimaryKey][int]标识(1,1)不为NULL,[Name][nvarchar](50)NULL,约束[PK_Table u_1]主键群集([PrimaryKey]ASC)与[PRIMARY]上的(PAD_INDEX=OFF,STATISTICS_norecomputer=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)一起[PRIMARY])GONo异常将被抛出,除非我尝试插入它两次,然后我在跟踪器中得到一个重复的键异常,我不确定它是否存在
class Program
{
    static void Main(string[] args)
    {
         DataClasses1DataContext ctx = new DataClasses1DataContext();
        try
        {
            for (int i = 0; i < 10; i++)
            {

                ctx.Table_1s.InsertOnSubmit(new Table_1
                {
                    Name = "John"
                });
                ctx.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
            }

            var list = from i in ctx.Table_1s
                       select i;

            foreach (var item in list)
            {
                Console.WriteLine(item.Name);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        //OUTPUT: "John"
        //        "John"
        //        "John" 
        //        "John"
        //        "John"
        //        "John"
        //        "John"
        //        "John"
        //        "John"
        //        "John"
        //        "John"


    }
}