在以下实例中,我尝试将问题简化为根组件。
我有一个非常简单的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();
}
}
答案 0 :(得分:0)
我建议手动运行SQL脚本来更改表并使列成为标识。看看这个答案
答案 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,并且我的代码工作正常。