0

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 は自動生成された ID であり、外部キーである obj_info.Id に挿入する必要があります

4

3 に答える 3

1

evert挿入後に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();
        }

これについては完全にはわかりませんが、うまくいきました

誰かがそれを確認できるなら教えてください

于 2012-08-18T23:16:30.667 に答える
1

手がかりはInsertOnSubmitという名前にあるはずです。トランザクションは送信されていないため、割り当てようとしても ID がありません。

このテーブル間の正確な関係については明確ではありませんが、obj テーブルに関連するレコードの ID を格納するために使用される objID という列を持つ obj_info というテーブルがある場合、C# クラスでは次のようになります。のような 2 つのプロパティを持つ

public Obj obj;
public int objID;

その場合は、使用できます

 obj_info.obj = obj;

それ以外の

 obj_info.objID = obj.id

テーブルが関連付けられていない場合は、id にアクセスする前に最初に obj を送信する必要があります。

于 2012-08-18T22:59:44.807 に答える
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
于 2012-08-18T22:44:32.593 に答える