1

TLDR の概要

ASP.net MVC の InsertOnSubmit() 関数にいくつか問題があります。重要な制約にぶつかることなく、新しいオブジェクトを構築してデータベースに挿入するにはどうすればよいでしょうか?

再現する手順

私は先に進んで、私が抱えていた 3 つほどの主要な問題の簡単なデモを作成しました。誰かがここで私を助けてくれるかもしれません。

  1. 新しい ASP.net MVC 2 プロジェクトを作成します。
  2. 1 対多のリレーションシップを使用して、実験と結果の 2 つのテーブルを作成します (以下を参照)。
  3. 「RunExperiment」と呼ばれるホーム コントローラー内に新しいアクションを作成します。
  4. 基本的な linq-to-sql データ コンテキストを作成します。
  5. RunExperiment で新しい実験と結果を生成し、それらを新しいデータ コンテキストを介してデータベースに挿入します。

主キーの重複を防ぎ、依存関係がそのまま維持されるようにするために必要な魔法があるため、このプロセスはすぐに崩壊します。

データベース設定のイメージ例。

ここで、サンプルの "RunExperiment" 関数を見てみましょう。

    public ActionResult RunExperiment(string Title, string Scientist)
    {
        RepositoryDataContext RDC = new RepositoryDataContext();

        // Generate the experiment
        Experiment thisExperiment = new Experiment();
        thisExperiment.experimentTitle = Title;
        thisExperiment.experimentScientist = Scientist;

        // Perform some work.
        System.Threading.Thread.Sleep(500);

        // Attempt to insert the experiment.  
        // Works once, fails subsequently due to duplicate primary key.
        RDC.Experiments.InsertOnSubmit(thisExperiment);
        RDC.SubmitChanges();

        for (int i = 0; i < 5; i++)
        {
            Result thisResult = new Result();
            thisResult.resultDate = DateTime.Now;
            thisResult.resultTemp = i;
            thisResult.Experiment = thisExperiment;

            RDC.Results.InsertOnSubmit(thisResult);
            RDC.SubmitChanges();
        }            

        return View("Index");
    }

何かご意見は?これが基本的なことであることはわかっていますが、Nerd Dinner パターンをコピーするだけでは解決しようとしていますが、これらのエラーが発生しています。

ありがとう!

4

3 に答える 3

2

まず、接続を破棄するのではなく、私のペットの不満の 1 つに対処する必要があります。

次に、LINQ を利用して、外部キーの関連付けを自動的に行います。SubmitChanges() を 1 回呼び出して、すべてを送信します。

public ActionResult RunExperiment(string Title, string Scientist)
{
    using (RepositoryDataContext RDC = new RepositoryDataContext())
    {
        // Generate the experiment
        Experiment thisExperiment = new Experiment();
        thisExperiment.experimentTitle = Title;
        thisExperiment.experimentScientist = Scientist;

        // Perform some work.
        System.Threading.Thread.Sleep(500);

        for (int i = 0; i < 5; i++)
        {
            Result thisResult = new Result();
            thisResult.resultDate = DateTime.Now;
            thisResult.resultTemp = i;

            // LINQ will automatically wire up the association during the insert
            thisExperiment.Results.Add(thisResult);
        }

        // Attempt to insert the experiment, with associated results
        RDC.Experiments.InsertOnSubmit(thisExperiment);
        RDC.SubmitChanges();
    }

    return View("Index");
}

ところで、これのデータ アクセス部分 (苦労しているすべてのもの) は LINQ to SQL であり、ASP.NET MVC に固有のものではありません。MVC で LINQ to SQL を使用する必要はなく、LINQ to SQL で MVC を使用する必要もありません。

于 2011-06-06T23:27:02.660 に答える
2

experimentIdSQL Server での列の設定を確認できますか。これは次のように設定する必要があると思います。

[experimentId] [int] IDENTITY(1,1) NOT NULL

削除したときにエラーを再現できましたIDENTITY

LINQ to SQL では、列のプロパティInt NOT NULL IDENTITYは「サーバー データ型」プロパティに含まれている必要があります。

于 2011-06-06T23:06:57.403 に答える
1

毎回 thisExperiment を挿入しようとしていますが、別の方法で実験の結果プロパティに結果を追加できますか?

または、それらをリンクするのではなく、experimentID を指定するだけですか?

于 2011-06-06T22:39:20.897 に答える