我是EF新手,但我会尽力描述这个场景。我的数据库中有3个表,即RecommendationTopic,Recommendation和Question。每个RecommendationTopic可以有多个建议书,每个建议书可能有多个问题。假设我的问题表中已经预定义了问题。
我有一项服务可以返回如下问题列表:
public List<Question> FetchQuestions(int categoryID)
{
using (Entities context = new Entities())
{
questions = context.Questions.Where(i => i.ID >= 0).ToList();
}
}
我有另一个服务,用于创建RecommendationTopic和Recommendation,其代码如下所示:
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
答案 0 :(得分:1)
如果您使用的是STE(自我跟踪实体),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();
}
}