【问题标题】:Two DbContexts using same models, error while saving使用相同模型的两个 DbContext,保存时出错
【发布时间】:2017-10-15 19:39:40
【问题描述】:

我正在尝试从 dbContext 获取数据并将其保存到其他 dbContext。 实际上,我想从数据库 A 导入一些基于某些验证的数据库并将其存储到数据库 B。我知道还有其他方法可以做到这一点,但我想使用带有两个 DBContext 的 EF。

这是场景: 我必须使用名称的 DbContext 类:T1EntitiesInterfaceDbContext

这些 dbContext 使用相同的模型。 就像我有一个名为 orders 的类,并且我在其他这些上下文中使用相同的类。

像这样:

public partial class T1Entities : DbContext
{
    public virtual DbSet<Order> Orders { get; set; }
}

public class InterfaceDbContext : DbContext
{
    public DbSet<Order> Orders { get; set; }
}

在我的GetOrder 函数中,我试图仅获取那些不存在于 InterfaceDbContext 中的订单并尝试在该上下文中插入。

public List<orders_mstr> GetOrders()
{
    // getting interface db Orders
    var interfaceOrders = _interfaceDb.Orders.ToList();

    // getting T1 db orders which are not present in it interface db
    var orders = _t1Db.Orders
                    .Where(o =>
                                interfaceOrders.All(x => x.id != o.id)
                    )
                    .ToList();


    // trying to save the first object.
    _interfaceDb.Orders.Add(orders[0]);
    _interfaceDb.SaveChanges();
}

我在保存时遇到异常:

EntityFramework.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:一个实体对象不能被多个 IEntityChangeTracker 实例引用。

请注意:我必须将保存订单类用于其他上下文。我知道我们可以通过为每个上下文创建不同的其他类来做到这一点。

【问题讨论】:

  • 在将实体添加到第二个上下文之前,您不需要将它们从第一个上下文中分离出来吗?
  • 我不确定。我们该怎么做?
  • 在检索数据之前关闭源上下文的代理创建,例如_t1Db.Configuration.ProxyCreationEnabled = false; var orders = _t1Db.Orders....

标签: c# asp.net-mvc database entity-framework entity-framework-6


【解决方案1】:

来自How do I detach objects in Entity Framework Code First?

var orders = _t1Db.Orders
    .AsNoTracking() // Query without tracking
    .Where(o =>
                interfaceOrders.All(x => x.id != o.id)
    )
    .ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2016-01-24
    相关资源
    最近更新 更多