如何避免在实体框架中启动多个上下文

时间:2011-01-28 11:21:05

标签: .net entity-framework

在Entity框架中,尝试运行以下代码:

        using (MyEntities ctx = new myEntities())
        {
            Entity.Customers.Build buildId = new ctx.Build();
            buildId.CustomerService = customerService;
            buildId.datCreatedDate = DateTime.Now;
            buildId.strBuildSchema = schema;
            buildId.Status = "Success";
            ctx.AddToBuilds(buildId);
            ctx.SaveChanges();
        }

导致错误“IEntityChangeTracker的多个实例无法引用实体对象”。

据我所知,问题是我正在创建的Build对象来自Entity Framework上下文的一个新实例,它不同于AddToBuilds()语句的上下文。

然而,我无法弄清楚如何解决这个问题。我似乎无法从实体上下文对象的实例化创建一个新的Build直接,即上面的代码中的ctx?有没有办法做到这一点,或者我错过了另一个明显的解决方法?

干杯, 马特

2 个答案:

答案 0 :(得分:0)

问题在于您将附加到上述代码(customerService?)中未显示的一个上下文的实体与另一个附加到{buildId的实体ctx相关联。 1}}。不要那样做。一次使用一个上下文。

答案 1 :(得分:0)

“customerService”(或者可能是“schema”)属于另一个EntityTracker。摆脱这种情况的最简单方法是在代码中添加以下代码行,其中加载了customerService (注意,在此处对customerService的类名做出假设):

ctx.CustomerService.MergeOptions = MergeOptions.NoTracking;

这行代码告诉上下文“我不打算对CustomerService对象进行任何更改,所以不要去追踪它们”。