我正在尝试使用Linq to sql执行以下事务。
但未检索 id 字段,因此发生异常
INSERT语句与FOREIGN KEY约束冲突
那该怎么办?
我的代码:
System.Data.Common.DbTransaction transaction = null;
DBDataContext db = new DBDataContext();
db.Connection.Open();
transaction = db.Connection.BeginTransaction();
db.Transaction = transaction;
Table1 = new Table1();
obj.objName = "some name";
db.Table1s.InsertOnSubmit(obj);
Table2 obj_info = new Table2();
obj_info.Info = "some info";
obj_info.Id = obj.Id;
db.Table2s.InsertOnSubmit(obj_info);
try
{
db.SubmitChanges();
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
}
finally
{
transaction.Dispose();
db.Dispose();
}
编辑:也许我的代码不够清晰 obj 变量具有主键ID,因此obj.Id是自动生成的标识 我需要将它插入obj_info.Id这是外键
答案 0 :(得分:1)
线索应该是名称 InsertOnSubmit 。您的交易未提交,因此在您尝试分配时没有ID。
我不清楚这些表之间的确切关系,但如果你有一个名为obj_info的表,它有一个名为objID的列,用于在obj表中存储相关记录的id,那么在你的c#类中你会期望有两个属性,如
public Obj obj;
public int objID;
如果是这种情况,则可以使用
obj_info.obj = obj;
而不是
obj_info.objID = obj.id
如果您的表格不相关,那么您需要先提交obj才能访问该ID。
答案 1 :(得分:1)
似乎我需要在外翻插入后使用SubmitChanges
System.Data.Common.DbTransaction transaction = null;
DBDataContext db = new DBDataContext();
db.Connection.Open();
transaction = db.Connection.BeginTransaction();
db.Transaction = transaction;
Table1 = new Table1();
obj.objName = "some name";
db.Table1s.InsertOnSubmit(obj);
db.SubmitChanges();
Table2 obj_info = new Table2();
obj_info.Info = "some info";
obj_info.Id = obj.Id;
db.Table2s.InsertOnSubmit(obj_info);
db.SubmitChanges();
try
{
db.SubmitChanges();
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
}
finally
{
transaction.Dispose();
db.Dispose();
}
我对此并不完全确定,但它有效
如果有人可以确认,请告诉我
答案 2 :(得分:0)
1. your obj_info.id has a not null value
2. your table2 doesn't have an incremental value
the mistake came from one of those points