1

我是EF新手,但我會盡我所能來描述場景。我在我的數據庫中有3個表,即RecommendationTopic,Recommendation和Question。每個RecommendationTopic可以有多個建議書,每個建議書可能有多個問題。假設我的問題表中已經有了預定義的問題。實體框架 - nTier中的非連通行爲

我有一個服務,它返回我的問題清單如下圖所示:

public List<Question> FetchQuestions(int categoryID) 
    { 
     using (Entities context = new Entities()) 
     { 
      questions = context.Questions.Where(i => i.ID >= 0).ToList(); 
     } 
    } 

我有它的代碼是一樣的東西下面,用來創建RecommendationTopic其他服務及建議:

public void ManageRecommendation(RecommendationTopic recommendationTopic) 
    { 
     using (Entities context = new Entities()) 
     { 
      context.AddObject("RecommendationTopics", recommendationTopic); 
      context.SaveChanges(); 
     } 
    } 

我的客戶代碼如下所示:

List<Question> questions; 
using (QuestionServiceClient client = new QuestionServiceClient()) 
{ 
    questions = client.FetchQuestions(); 
} 

using (RecommendationServiceClient client = new RecommendationServiceClient()) 
{ 
    RecommendationTopic rTopic = new RecommendationTopic(); 
    rTopic.CategoryID = 3; 
    rTopic.Name = "Topic From Client"; 
    Recommendation rCom = new Recommendation(); 
    rCom.Text = "Dont!"; 
    rCom.RecommendationTopic = rTopic; 
    rCom.ConditionText = "Some condition"; 
    rCom.Questions.Add(questions[0]); 
    rCom.Questions.Add(questions[1]); 
    client.ManageRecommendation(rTopic); 
} 

由於客戶使2個獨立的服務呼叫,上下文對於這兩個呼叫都是不同的。當我嘗試運行這個並檢查EF分析器時,它不僅生成查詢以插入RecommendationTopic和Recommendation,而且還生成問題表!

我確定這是由於兩個調用的不同上下文引起的,因爲當我在單個上下文中執行類似的代碼時,它會按照它的工作原理工作。

問題是,我該如何讓它在斷開連接的情況下工作?

我的客戶端可能是Silverlight客戶端,我需要用單獨的調用填充問題下拉菜單,並在另一個調用中保存推薦主題。出於這個原因,我也在使用自我跟蹤實體。

任何輸入讚賞! -Vinod

回答

1

如果您正在使用國營貿易公司(個體經營跟蹤實體)您ManageRecommendation應該是這樣的:

public void ManageRecommendation(RecommendationTopic recommendationTopic) 
{ 
    using (Entities context = new Entities()) 
    { 
     context.RecommendationTopics.ApplyChanges(recommendationTopic); 
     context.SaveChanges(); 
    } 
} 

調用AddObject跳過你的實體的自我跟蹤行爲。如果您不使用STE,則必須遍歷所有問題並將其狀態更改爲Unchanged

public void ManageRecommendation(RecommendationTopic recommendationTopic) 
{ 
    using (Entities context = new Entities()) 
    { 
     context.RecommendationTopics.AddObject(recommendationTopic); 
     foreach (var question in recommendationTopic.Questions) 
     { 
      context.ObjectStateManager.ChangeObjectState(recommendationTopic, EntityState.Unchanged); 
     } 
     context.SaveChanges(); 
    } 
} 
+0

您先生已經讓我的一天!輝煌!有用! – Vinod