【问题标题】:Entity Framework - Disconnexted Behavior in nTier实体框架 - nTier 中的脱节行为
【发布时间】:2011-06-27 04:53:26
【问题描述】:

我是 EF 的新手,但我会尽力描述这个场景。我的数据库中有 3 个表,即 RecommendationTopic、Recommendation 和 Question。每个 RecommendationTopic 可以有多个 Recommendations,每个 Recommendation 可能有多个问题。假设我的问题表中已经有预定义的问题。

我有一项服务会返回如下问题列表:

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 的查询,还会生成 Question 表!

我确信这是由于两个调用的上下文不同造成的,因为当我在单个上下文中执行类似的代码时,它可以正常工作。

问题是,如何使它在断开连接的情况下工作?

我的客户可能是 Silverlight 客户,我需要通过单独的调用填写问题下拉列表并将推荐主题保存在单独的调用中。出于这个原因,我也在使用自我跟踪实体。

任何意见表示赞赏! -维诺德

【问题讨论】:

    标签: entity-framework-4 linq-to-entities self-tracking-entities


    【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多