2011-11-15 11 views
1

我有根據我的DataGridView生成記錄的代碼。這些記錄是臨時的,因爲它們中的一些已經存在於數據庫中。如何創建Linq-To-Sql類型的臨時記錄而不引起重複密鑰問題?

 Crop_Variety v = new Crop_Variety(); 
     v.Type_ID = currentCropType.Type_ID; 
     v.Variety_ID = r.Cells[0].Value.ToString(); 
     v.Description = r.Cells[1].Value.ToString(); 
     v.Crop = currentCrop; 
     v.Crop_ID = currentCrop.Crop_ID; 

不幸的是在這個代碼點點,因爲我說v.Crop = currentCrop, 現在currentCrop.Crop_Varieties包括這個臨時記錄。當我插入這個新網格的記錄時,他們對同一個Crop記錄有一個引用,因此當我提交時,數據庫中已經存在的這些臨時記錄會顯示兩次,導致重複的鍵錯誤。

我有一個整體的系統,用於檢測記錄所需要的添加,需要基於什麼用戶操作的,而是通過引用的這個無情的跟蹤其越來越粘住了被刪除的內容。

有沒有一種方法,我可以從自動將這些臨時的記錄,它的表集合停止的LINQ到SQL?

+0

你能解釋一下爲什麼你創建新的'Crop_Variety'實例,但不希望它們被持久化。還是你希望L2S在堅持它們之前找出哪些是重複的? –

+0

我正在嘗試爲DataGridView中的所有記錄創建實例。並非所有數據都直接映射到datagridview,因此我不確定是否可以進行任何類型的自動更新/插入。 我完全重組了我的保存代碼,因爲這個問題一直在我當前的系統中出現,但是如果在處理網格行數據的時候有更好的方法來識別現有記錄和新記錄,那將非常棒。 –

回答

1

我會建議重新審查該填充有記錄的DataGridView(網格)的代碼。

,然後再回到該工作從一個GridView的項目,牢記您可以使用下面的代碼抓住從一個網格行界項目代碼:

public object GridSelectedItem 
{ 
    get 
    { 
     try 
     { 
      if (_grid == null || _grid.SelectedCells.Count < 1) return null; 
      DataGridViewCell cell = _grid.SelectedCells[0]; 
      DataGridViewRow row = _grid.Rows[cell.RowIndex]; 
      if (row.DataBoundItem == null) return null; 
      return row.DataBoundItem; 
     } 
     catch { } 
     return null; 
    } 
} 

這也很難理解的本質您發佈的Crop_Variety代碼。由於Crop_Variety似乎是Crop的一個子類。當Crop尚未綁定到數據庫時,這會導致問題,並且在將Crop_Variety添加到上下文時可能會導致問題。

對於這種類型的應用形式,我通常有列表_dataList形式類中,則主網格綁定到該列表,通過ObjectBindingList或另一種方式。這樣,_dataList保存需要時需要保留的所有數據(用戶單擊保存)。

+0

這聽起來像它會起作用。我的Crop_Variety的例子不再真正相關,所以我爲這種混淆道歉。 –

0

當您分配實體對象引用時,您正在兩個對象之間創建鏈接。這裏你是這樣做的:

v.Crop = currentCrop; 

只有一種方法可以避免這種情況:修改生成的代碼或生成/編寫自己的代碼。我絕不會這樣做。

我想你會通過編寫自定義DTO類,而不是重用生成的實體更好。我已經完成了兩種方法,我更喜歡後者。

編輯:下面是一些示例生成的代碼:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="RssFeed_RssFeedItem", Storage="_RssFeed", ThisKey="RssFeedID", OtherKey="ID", IsForeignKey=true, DeleteOnNull=true, DeleteRule="CASCADE")] 
    public RssFeed RssFeed 
    { 
     get 
     { 
      return this._RssFeed.Entity; 
     } 
     set 
     { 
      RssFeed previousValue = this._RssFeed.Entity; 
      if (((previousValue != value) 
         || (this._RssFeed.HasLoadedOrAssignedValue == false))) 
      { 
       this.SendPropertyChanging(); 
       if ((previousValue != null)) 
       { 
        this._RssFeed.Entity = null; 
        previousValue.RssFeedItems.Remove(this); 
       } 
       this._RssFeed.Entity = value; 
       if ((value != null)) 
       { 
        value.RssFeedItems.Add(this); 
        this._RssFeedID = value.ID; 
       } 
       else 
       { 
        this._RssFeedID = default(int); 
       } 
       this.SendPropertyChanged("RssFeed"); 
      } 
     } 
    } 

正如你可以看到生成的代碼是說建立鏈接「value.RssFeedItems.Add(本);」。

如果你有至極,你需要很多的DTO通過使用反射,你可以編寫代碼,生成的DTO類許多實體。