SQL Azure数据库/无法在SubmitChanges期间将记录插入到表/ ID中

时间:2014-01-18 17:02:34

标签: visual-studio-2012 linq-to-entities azure-sql-database

在以下实例中,我尝试将问题简化为根组件。

我有一个非常简单的SQL Azure数据库,我在其中创建了一个名为Table1的测试表。 Azure创建一个ID字段,其中包含Is Required,Is Key Key。它不允许选中标识框。还有一些其他领域只是需要。

在我的VS2012项目中,我创建了一个LinqToSql类,它创建了一个ProductionDataClasses1.dbml对象。

我只想通过下面显示的方法向此表添加记录。根据我正在阅读的内容,在指定InsertOnSubmit(NewRecord)之后,将在SubmitChanges()期间设置ID。

它第一次工作但值设置为零。在后续保存中,我得到一个异常(基本上它是一个重复的记录,因为ID = 0已经存在)。

为了说明这一点,我在下面提供了一些示例代码。我们的想法是先检查记录是否存在并进行更新。如果没有,我想添加一条记录。

我的问题是......我需要手动设置ID吗?如果是这样,我如何将值设置为int以及如何检索下一个值。我尝试换到Guid但不允许。

这是我的代码示例:

      public bool AddTestRecord(string someValue)
     {
         ProductionDataClasses1DataContext context = new ProductionDataClasses1DataContext();
         try
         {
             var ExistingRecord = context.Table1s.SingleOrDefault(c => c.TextKey == someValue);
             if (ExistingRecord == null)
             {
                 var NewRecord = new Table1();

              //   NewRecord.ID = ???? ; How Do I Manually Set.  It is getting set to 0 causing a duplicate value exception
                 NewRecord.TextKey = someValue;
                 NewRecord.AnotherValue = DateTime.Now.ToShortTimeString();
                 context.Table1s.InsertOnSubmit(NewRecord);

             }
             else
             {
                 ExistingRecord.AnotherValue = DateTime.Now.TimeOfDay.ToString();
             }
             context.SubmitChanges();
             return true;
         }
         catch (Exception e)
         {
             Console.WriteLine(e.Message);
             return false;
             context.SubmitChanges();
         }
     }

2 个答案:

答案 0 :(得分:0)

我建议手动运行SQL脚本来更改表并使列成为标识。看看这个答案

Adding an identity to an existing column

答案 1 :(得分:0)

感谢您的回复。

我终于能够在新桌面上完成这项工作,并会尝试按照您的指示对我的真实表格进行修改。我的代码(如上所述)没问题,因此问题出在SQL Azure表定义中。

我发现问题在于,当您在SQL Azure中创建新表时,它会创建一个包含三个字段的表,ID,Column1,Column2。默认情况下,ID被设置为主键,但没有被选为Is Identity。

为了完成这项工作,我将ID设为Is Identity,取消选中PrimaryKey,将Column1设为In Primary Key。因此,当保存新记录时,将设置ID并检查Column1以确保它不在系统中。在第一次创建表时我必须这样做。一旦保存,它就不允许我改变。

之后,我更新了我的Linq To SQL类并删除了新表。我注意到现在已经设置了Column1上的AutoGenerated Value和Column1上的PrimaryKey,并且我的代码工作正常。