gpt4 book ai didi

entity-framework - 引用另一个上下文中的实体创建新实体

转载 作者:行者123 更新时间:2023-12-01 05:49:04 26 4
gpt4 key购买 nike

我有 2 个项目 PRJ1 PRJ2 使用自己的数据库 DB1 DB2 .这些数据库中的每一个都使用 EF Code First Migration。

  • PRJ1 用于管理产品库存(已存在 4 年)。
  • PRJ2 用于订单(全新项目仍在开发中)

  • 现在我们只谈第二个项目。在我的项目中 PRJ2 我需要访问另一个数据库中的数据 DB1 .所以我需要为产品下订单。

    这是我目前得到的 PRJ2
    请注意,我定义了 2 个不同的上下文。
    // Context for accessing entities in DB1
    public class DB1Context : DbContext
    {
    static DB1Context()
    {
    Database.SetInitializer<DB1Context>(null);
    }
    public DbSet<Product> Products { get; set; }
    }

    // Context for accessing entities in DB2
    public class DB2Context : DbContext
    {
    static DB2Context()
    {
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<DB2Context, DAL.Migrations.Configuration>());
    }
    public DbSet<Anything> Anythings { get; set; }
    public DbSet<Order> Orders { get; set; }
    }

    什么有效 :我可以从 DB1Context (Products) 或 DB2Context (Anythings) 查询数据。

    什么还不行 : 创建我的 订单实体。
    // My Orders entity
    public class Orders
    {
    public int Id { get; set; }
    public int ProductId { get; set; }
    public int Quantity { get; set; }

    public virtual Product Product { get; set; }
    }

    这个位于 DB2Context 中的实体引用了 Product作为 DB1Context 一部分的实体。

    现在的问题是,只要我在我的上下文中添加这个实体 DbSet<Order>我看到有一个等待 Product 的迁移。此迁移用于在我的 DB2Context 中创建产品。那不是我想要的。该实体已存在于 DB1Context 中。似乎我无法创建从其他上下文引用 Product 的 Order 实体。

    你能证实这一点吗?我错过了什么吗?否则什么是最好的选择?

    最佳答案

    我认为您不能使用 Entity Framework 来做到这一点。

    这个问题看起来像一个 No-SQL 数据库的问题。当您有多个这样的数据库时,您必须控制所有数据库的所有 CRUD。 ADO 无法对您执行此操作,因为您没有数据完整性。

    一个可能的解决方案是将 CRUD 放在业务逻辑层中......或类似的东西。

    假设您有一个 OrderBll控制:

    public class OrderBll
    {
    private DB1Context _DB1Context = new DB1Context();
    private DB2Context _DB2Context = new DB2Context();

    public List<Orders> GetOrders()
    {
    var orders = _DB2Context.Orders.Where(???).ToList();
    var productIds = orders.Select(x => x.ProductId).Distinct().ToArray();
    var products = _DB1Context.Products.Where(x => productIds.Contains(x.Id)).ToList(); // Optimize the load of all products in orders

    // Set the product object in the order list
    foreach( var order in orders )
    {
    order.Product = products.FirstOrDefault(x=>x.Id == order.ProductId);
    }
    return orders;
    }
    }

    请记住,您必须映射 Product房产在 Orders喜欢 Ignore .

    因此,您必须自己设置外键并执行所有约束检查。

    但是,如果其他人有更好的解决方案来做到这一点,我会很高兴知道。

    关于entity-framework - 引用另一个上下文中的实体创建新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57311162/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com