2012-03-13 31 views
1

以下のコードを実行すると、このエラーCannot add an entity with a key that is already in use.が発生します。既に使用されているキー(LINQ)を持つエンティティを追加できません

テーブル: enter image description here

私は何をしないのですか?

private void CopyAllPageObjects(int fromPageID, int toPageID) 
    { 
     CMSDataContext _db = new CMSDataContext(); 

     // Copy page objects 
     var originalPageObjects = (from x in _db.CMSPageObjects 
            where x.PageID == fromPageID 
            select x); 

     List<CMSPageObject> newPageObjects = new List<CMSPageObject>(); 
     foreach (CMSPageObject po in originalPageObjects) 
     { 
      CMSPageObject newPageObject = new CMSPageObject(); 
      newPageObject.PageID = toPageID; 
      newPageObject.CMSObjectID = po.CMSObjectID; 
      newPageObject.Name = po.Name; 
      newPageObject.Sorting = po.Sorting; 
      newPageObjects.Add(newPageObject); 

      // Copy page object attribute values 
      var originalPoavs = (from x in _db.CMSPageObjectAttributeValues 
           where x.CMSPageObjectID == po.ID 
           select x); 

      List<CMSPageObjectAttributeValue> newPoavs = new List<CMSPageObjectAttributeValue>(); 
      foreach (CMSPageObjectAttributeValue poav in originalPoavs) 
      { 
       CMSPageObjectAttributeValue newPoav = new CMSPageObjectAttributeValue(); 
       newPoav.CMSAttributeID = poav.CMSAttributeID; 
       newPoav.CMSPageObjectID = newPageObject.ID; 
       newPoav.LCID = poav.LCID; 
       newPoav.Value = poav.Value; 
       newPoavs.Add(newPoav); 
      } 
      _db.CMSPageObjectAttributeValues.InsertAllOnSubmit(newPoavs); 
     } 

     _db.CMSPageObjects.InsertAllOnSubmit(newPageObjects); 
     _db.SubmitChanges(); 
    } 
+3

どの行にエラーがスローされますか? – Reniuz

+0

'newPoav.CMSPageObjectID = newPageObject.ID; 'はエラーをスローします。 – Martin

+0

テーブルレイアウトで質問を更新しました。 – Martin

答えて

3

オブジェクトを追加しようとしているようですが、同じ主キーを持つ別のオブジェクトが存在しているようです。 PageIDまたはCMSObjectIDプライマリキーですか?またはCMSAttributeID

さらに、データテーブルの表示方法に関するデータを共有したい場合もあります。

更新:あなたはまだDBにオブジェクトを追加していないので(、

newPoav.CMSPageObjectID = newPageObject.ID; 

newPageObject.IDが、おそらくこの時点では知られていない:あなたは、データベースの構造体を追加した後、私はこの行をよく見ます私はIDが身元だと思う)。私はあなたが使用できると思う:私はこのエラーを得ていたと私は、データベースへの「アイデンティティ仕様」(自動インクリメント)に主キーフィールドを設定し忘れていたので、それがあった

newPoav.CMSPageObject = newPageObject 
+0

テーブルレイアウトで質問を更新しました。 – Martin

+0

ありがとうございます。私は私の答えを更新しました;) – Arek

+0

ありがとう!それは働いているように見えます! – Martin

2

CMSPageObjectテーブルにプライマリキーまたは一意のキーがありません。データベースのキーを確認してみてください。私はテーブルのPKを見逃していたので、同じ問題がありました。

乾杯。

+0

テーブルレイアウトで質問を更新しました。 – Martin

4

。しかし、それはあなただけの単なるテストにこの

 foreach (CMSPageObjectAttributeValue poav in originalPoavs) 
     { 
      CMSPageObjectAttributeValue newPoav = new CMSPageObjectAttributeValue(); 
      newPoav.CMSAttributeID = poav.CMSAttributeID; 
      newPoav.CMSPageObjectID = newPageObject.ID; 
      newPoav.LCID = poav.LCID; 
      newPoav.Value = poav.Value; 
      newPoavs.Add(newPoav); 
      if(_db.CMSPageObjectAttributeValues.Any(x=>x.LCID == newPoav.LCID & x.CMSAttributeID == newPoav.CMSAttributeID & x.CMSPageObjectID == newPoav.CMSPageObjectID)) 
      MessageBox.Show("Already exist"); 
     } 

を追加することができます

データベースに既に存在しているあなたは、リストnewPoavsが鍵を持っている場合は、単にテストのためにいくつかのコードを追加する必要がちょうど推測

+0

テーブルレイアウトで質問を更新しました。 – Martin

0

ですあなたの値

関連する問題