2013-01-21 42 views
0

我試圖通過相關問題找到答案,但我沒有看到現在的相同情況。我是這個框架的初學者。 問題是,在數據庫中總是引用TopicFeedbackType,但如果我附加實體,則TopicNavigatedUrl和Product總是插入事件。我究竟做錯了什麼?我將找到的實體附加到正確的實體集名稱。實體被附加。我注意到,在p_TopicQuickFb有一個附屬實體更新其屬性之前,它的EntityKey爲空,但是當currentNavUrl(例如)被設置時,p_TopicQuickFb的EntityKey不再爲空。它的值是「EntitySet = TopicQuickFeedbacks」,但沒有id。 我真的迷失在那裏。EF:將相關實體設置爲INSERT,而不是僅引用添加的實體

public void AddTopicQuickFeedback(TopicQuickFeedback p_TopicQuickFb, string p_SessionID) 
    { 
      TopicFeedbackType currentType = this.GetTopicFeedbackType(p_TopicQuickFb.TopicFeedbackType.FeedbackType); 
      bool currentTypeAttached = false; 

      TopicNavigatedUrl currentNavUrl = this.GetTopicNavigatedUrl(p_TopicQuickFb.TopicNavigatedUrl.Url); 
      bool currentNavUrlAttached = false; 

      Product currentProduct = this.GetProduct(p_TopicQuickFb.Product.Name, p_TopicQuickFb.Product.MajorVersion, p_TopicQuickFb.Product.MinorVersion); 
      bool currentProductAttached = false; 

      using (COHFeedbackEntities context = GetObjectContext()) 
      { 
       TopicFeedback tf = GetTopicFeedback(p_SessionID, context); 
       if (tf != null) 
       { 

        if (currentType != null) 
        { 
         p_TopicQuickFb.TopicFeedbackType = null; 
         context.AttachToOrGet<TopicFeedbackType>("TopicFeedbackTypes", ref currentType);     
         currentTypeAttached = true;        
         p_TopicQuickFb.TopicFeedbackType = currentType; 
        } 

        if (currentNavUrl != null) 
        { 
         p_TopicQuickFb.TopicNavigatedUrl = null; 
         context.AttachToOrGet<TopicNavigatedUrl>("TopicNavigatedUrls", ref currentNavUrl);       
         currentNavUrlAttached = true; 
         p_TopicQuickFb.TopicNavigatedUrl = currentNavUrl; 
        } 

        if (currentProduct != null) 
        { 
         p_TopicQuickFb.Product = null; 
         context.AttachToOrGet<Product>("Products", ref currentProduct);     
         currentProductAttached = true; 
         p_TopicQuickFb.Product = currentProduct; 
        } 

        tf.TopicQuickFeedbacks.Add(p_TopicQuickFb); 
        context.SaveChanges(); 
        context.Detach(tf); 

        if (currentNavUrlAttached) 
        { 
         context.TopicNavigatedUrls.Detach(currentNavUrl); 
        } 
        if (currentProductAttached) 
        { 
         context.Products.Detach(currentProduct); 
        } 
        if (currentTypeAttached) 
        { 
         context.TopicFeedbackTypes.Detach(currentType); 
        } 
       } 
      } 
     } 

我發現這個職位的方法:Is is possible to check if an object is already attached to a data context in Entity Framework?

public static void AttachToOrGet<T>(this System.Data.Objects.ObjectContext context, string entitySetName, ref T entity) 
     where T : IEntityWithKey 
    { 
      System.Data.Objects.ObjectStateEntry entry; 
      // Track whether we need to perform an attach 
      bool attach = false; 
      if (
       context.ObjectStateManager.TryGetObjectStateEntry 
         (
         context.CreateEntityKey(entitySetName, entity), 
         out entry 
        ) 
      ) 
      { 
       // Re-attach if necessary 
       attach = entry.State == EntityState.Detached; 
       // Get the discovered entity to the ref 
       entity = (T)entry.Entity; 
      } 
      else 
      { 
       // Attach for the first time 
       attach = true; 
      } 
     if (attach) 
     { 
      context.AttachTo(entitySetName, entity); 
     } 
    } 

測試方法:

 User user = new User(true, false, false); 
     string commentStr = "This is my comment"; 

     Product product = new Product("ProductName", 7, 0); 

     TopicFeedbackComment commFeedback = new TopicFeedbackComment(commentStr, new TopicNavigatedUrl("http://testurl.com/test0"), product); 

     TopicFeedback feedback = new TopicFeedback(sessionID, user, FeedbackState.New); 


     provider.AddTopicFeedback(feedback); 

     TopicFeedback addedFeedback = provider.RetrieveTopicFeedback(sessionID); 

     provider.AddTopicFeedbackComment(commFeedback, sessionID); 

這一次又一次的運行也只需插入到

無法張貼圖像,以便我可以在必要時提供架構。

+0

我自己找到了。 分配實體是錯誤的。 贊:p_TopicQuickFb.TopicFeedbackType = currentType; 正確的解決方案是隻分配id並在實體連接時保留null屬性 像:p_TopicQuickFb.TopicFeedbackTypeID = currentType.Id; 希望這會幫助一些! – Cedric

回答

0

我的回答是在我最後的評論中。我自己找到了。

如果有人想評論它爲什麼這樣工作,這將是很好的! :)

相關問題