我想尝试插入我的SQL Server数据库中的多个表,但是我的第一个插入之一会生成一个IDENTITY值的外键,我希望在后续插入中使用它。我不确定如何在LINQ to SQL中使用它。我想我可以在多个交易中做到这一点,但我更喜欢在一个地方做这个......也就是在使用条款中。
我的伪代码算法如下:
使用新的外键值创建一个对象并更新TABLE2。
using (var sms = new SmsDataDataContext(connection_string)
{
foreach(SomeObject i in ListofObject)
{
TABLE1 t1 = CheckID(sms, i.ID);
if (t1== null)
{
TABLE1 new_row = new TABLE1();
sms.TABLE1.InsertOnSubmit(new_row);
//Ideally I want to do something like this even though i dont think it will work.
sms.SubmitChanges();
TABLE2 update_row = new TABLE2();
update_row.ID = new_row.COL1.value; //has the newly created identity value from my last insert.
//Assume this update_row exist in my TABLE2 table.
sms.TABLE2.InsertOnSubmit(update_row);
}
}
sms.SubmitChanges();
}
答案 0 :(得分:3)
LINQ to SQL是围绕对象图上的工作模式而不是每行的单独语句构建的。假设您的父(Table1)和子(Table2)之间存在关联,您应该能够构建图形并发出一个SubmitChanges。 LINQ to SQL将根据先前提交的值自动处理子项的父ID设置。
using (var sms = new SmsDataDataContext(connection_string)
{
foreach(SomeObject i in ListofObject)
{
TABLE1 t1 = CheckID(sms, i.ID);
if (t1== null)
{
TABLE1 new_row = new TABLE1();
sms.TABLE1.InsertOnSubmit(new_row);
TABLE2 update_row = new TABLE2();
new_row.Table2s.Add(update_row);
}
}
sms.SubmitChanges();
}
答案 1 :(得分:0)
您可以使用TransactionScope
。
只需将整个数据库调整块包装在其中:
using (var MyTran = new TransactionScope())
{
try{
//Insert #1
//Insert #2
...
MyTran.Complete();
}catch{
// if the flow of control comes here, transaction will not be committed
}
}
如您所见,如果您的代码在执行Complete()之前执行,则会得到回滚。
<强>参考强>