2011-06-06 176 views
1

TLDR總結我在與ASP.net MVC的InsertOnSubmit()函數中的幾個問題ASP.net MVC LINQ到SQL插入問題

。如何在沒有運行到關鍵約束的情況下構建新的對象並將其插入到數據庫中?

步驟來重現

我已經先行一步,創造了我一直有3或那麼大的問題一個簡單的演示,也許有人可以幫助我在這裏。

  1. 創建一個新的ASP.net MVC 2項目。
  2. 創建兩個表格 - 具有一對多關係的實驗和結果(如下所示)。
  3. 在主控制器內創建一個名爲「RunExperiment」的新操作。
  4. 創建一個基本的linq-to-sql數據上下文。
  5. 讓RunExperiment生成一個新的實驗和結果,並通過新的數據上下文將它們插入到數據庫中。

這個過程分崩離析很快,因爲有一些神奇的需要發生,以防止重複的主鍵以確保依賴性保持不變。

Example image of database setup.

現在看看我的例子 「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模式,但我得到這些錯誤。

謝謝!

回答

2

你能確認你的experimentId列在SQL Server中設置了 - 我相信這應該被設置爲:

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

我能夠重現你的錯誤,當我刪除了IDENTITY

在LINQ to SQL中,列的屬性在「服務器數據類型」屬性中應該有Int NOT NULL IDENTITY

+0

是的;那是錯誤的。非常感謝! – 2011-06-07 02:58:30

+0

+1這很可能是問題的原因。 – 2011-06-07 03:13:15

1

它試圖每次再次插入thisExperiment,你可以做另一個周圍,將結果添加到實驗的結果屬性?

或者,或者只是指定experimentID而不是鏈接它們?

2

首先,您需要解決我的一個難題 - 不要處理您的連接。

然後,利用LINQ自動爲您執行外鍵關聯。調用SubmitChanges()一次提交全部。

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。

+0

同意;這可能會更清潔。我實際上是遵循書呆子晚餐例子中使用的存儲庫模式。你是爲每種方法創建/處理數據上下文,還是創建一個由模型/存儲庫使用的實例,然後保持活動狀態? – 2011-06-07 02:59:35

+0

使用連接池 - 這就是它的用途。我不記得他們是如何在書呆子晚宴中做到的,但總的來說,最好的做法是隻要你需要它就保持連接。 – GalacticCowboy 2011-06-07 20:55:33

+0

感謝銀河。什麼是我瞭解連接池的最佳方式?我正在做一些搜索,但空着。 – 2011-07-10 05:59:57