2009-07-15 79 views
1

我使用LINQ2SQL我有一個表叫做客戶有三列LINQ到SQL DuplicateKeyException問題

CustmerID,CustomerCode,客戶名稱

CustmerID是Primery鍵(身份= YES)和CustomerCode只是唯一鍵。

當我更新此表使用LINQ to SQL與重複的客戶代碼,我期望看到DuplicateKeyException,但它將進入一般異常塊而不是DuplicateKeyException塊。有任何想法嗎?

這是代碼

公共無效更新(客戶CUST) { 使用(LINQDemoDataContext分貝=新LINQDemoDataContext()){ 顧客 實體= CustomerMapper.ToEntity(新的顧客(),卡斯特);

  try 
      { 
       db.Customers.Attach(entity, true); 
       db.SubmitChanges(); 
      } 

      //Concurrency Exception 
      catch (ChangeConflictException) 
      {        
       throw new ChangeConflictException("A concurrency error occurred!"); 
      } 

      //duplicate record 
      catch (DuplicateKeyException) 
      { 
       throw new DuplicateKeyException(entity.CustmerCode); 
      } 

      //everything else 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 
    } 

我使用VisualWebDeveloperExpress 2008和SQL Express的2005

感謝&問候, Supremestar

+2

當拋出像這樣的異常時,我會將原始異常作爲InnerException(使用不同的構造函數)。另外,不要用`throw ex;`代替最後一個catch,只需使用`throw;`。 – 2009-07-15 15:46:24

+0

或者,如果您不處理它,只是不要捕獲最後一個異常。 – 2009-07-15 15:46:54

回答

2

如果沒記錯,我可能是錯在這裏,DuplicateKeyException只有主鍵火災的表格。

0

我遇到了同樣的問題,重複鍵對象被保留在內存中,即使它們沒有被插入到數據庫中。我想出了以下解決方法:

MyDataContext _myDataContext = new MyDataContext(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString); 

    public void AddObject(object myObject) 
    { 
     try 
     { 
      _myDataContext.Objects.InsertOnSubmit(myObject); 
      _myDataContext.SubmitChanges(); 
     } 
     catch (System.Data.Linq.DuplicateKeyException ex) 
     { 
      _myDataContext = new MyDataContext(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString); 
      throw ex; 

然後,您可以捕獲並處理(或忽略)拋出DuplicateKeyException在調用者。

另一個解決方法是,在AddObject方法內部創建一個新的數據上下文,而不是使用作爲類成員實例化的共享數據上下文。

0

我在添加一個實體時遇到了問題,我得到了一個不同的DataContext。
(我結合的BarDb實體的FooDb,物業給的SelectedValue從一個DropDownList,它有一個表從短版活的DataContext作爲數據源)
讓我們來看看LINQ2SQL內部連接(實體):

private void attach_FooDb(FooDb entity){ 
    this.SendPropertyChanging(); 
    entity.BarDb = this; 
} 

而且BarDb屬性設置:

set{ 
    BarDb previousValue = this._BarDb.Entity; 
    if (((previousValue != value) || (this._BarDb.HasLoadedOrAssignedValue == false))){ 
     this.SendPropertyChanging(); 
     if ((previousValue != null)){ 
      this._BarDb.Entity = null; 
      previousValue.FooDb.Remove(this); 
     } 

     this._BarDb.Entity = value; 

     if ((value != null)){ 
      value.FooDb.Add(this); 
      this._FK_Bar = value.ID; 
     }else{ 
      this._FK_Bar = default(System.Guid); 
     } 
     this.SendPropertyChanged("BarDb"); 
    } 
} 

所以附加到FooDb時,相應的DataContext將識別BarDb實體新建和補充說,即使它在數據庫中已經存在。

你可以解決它:

  • 只使用單一的DataContext或
  • 在提交的DataContext,這將首先從數據庫中請求「平等」的實體創建一個BarDb_safe屬性,適用所有屬性然後以通常的方式附加它。