在Linq事务中检索标识值

时间:2012-08-18 22:18:05

标签: c# linq-to-sql transactions

我正在尝试使用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这是外键

3 个答案:

答案 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