【问题标题】:How can I declare just one db variable that will look either to the Entities1.edmx or to Entities2.edmx我怎样才能只声明一个 db 变量,它看起来要么是 Entities1.edmx 要么是 Entities2.edmx
【发布时间】:2018-08-08 22:14:34
【问题描述】:

我在 Oracle 中有两个架构,它们有很多重叠的表。但仍然必须将数据分开保存。这就是为什么我有 2 个模式,其中 80% 的表完全相同。我有一个 Windows 窗体应用程序有两个连接到每个架构的 Entity Framework 6 edmx。

PMSEntities pmsdb = new PMSEntities();
GRMSEntities grmsdb = new GRMSEntities();

我在两个 edmx 上都有一个客户实体。

要访问它,我可以这样做:

if (ispms) 
  pmsdb.clients.whatever;
else 
  grmsdb.clients.whatever;

这很麻烦,每次都做两次。

我试过了:

DbContext db;

if (ispms)
  db = new PMSEntities();
else
  db = new GRMSEntities();

db.clients.whatever;

但随后 db 无法识别 Client 类。

我尝试只使用一个带有客户端实体的 edmx。首先是模型/数据库。然后,如果我初始化 edmx,只需更改并传递连接字符串。但是 edmx 是从特定模式构建的。所以虽然表名和属性是完全一样的。 edmx 只是从构建 edmx 的架构中工作。

应用程序在整个应用程序中一次只能连接到一个 oracle 模式。它将是 GRMS 或 PMS 架构。

我怎样才能只声明一个 db 变量,该变量将查看 PMSEntities.edmx 或 GRMSEntities.edmx。

【问题讨论】:

    标签: c# oracle entity-framework


    【解决方案1】:

    显然,您有两个具有许多相似属性和方法的类:PmsEntitiesGRMSEntities。虽然你没有这么说,但我认为这两个类都派生自DbContext

    我看到了两种解决方案。它们与实体框架无关,只是简单的面向对象编程:要么创建一个包含所有 DbSet 的类,这些 DbSet 都在两个 DbContext 中。从中派生 Pms 和 Grms。

    或类似的使用接口

    class BaseDbContext : DbContext
    {
         public DbSet<Client> Clients {get; set;}   // both Pms and Grms have Clients
         ...
    }
    
    class PmsEntities : BaseDbContext 
    {
         public DbSet<OnlyPmsType> OnlyPmsTypes {get; set;}    // only in Pms
         ...
    }
    class PmsEntities : BaseDbContext  
    {
         public DbSet<OnlyGrmsType> OnlyGrmsTypes {get; set;}    // only in Grms
         ...
    }
    

    另一个更简洁的解决方案是使用界面。从 Pms 和 Grms 中确定您想要的 DbSet:

    interface IMyInterface
    {
         IDbSet<Client> Clients {get; set;}
         IDbSet<...>  ...
    
         void SaveChanges();
    }
    
    class Pms : DbContext, IMyInterface {...}
    class Grms: DbContext, IMyInterface {...}
    

    还有一个工厂函数:

    IMyInterface GetDbContext(bool ispms)
    {
        return ispms ? new Pms() : new Grms();
    }
    

    用法就像您拥有原始 DbContext:

    bool ispms = ...
    using (var dbContext = GetDbContext(ispms)
    {
         var fetchedClient = dbContext.Clients
             .Where(client => ...)
             .FirstOrDefault();
         if (fetchedClient != null)
         {
              fetchedClient.Name = ...
              dbContext.SaveChanges();
         }
    }
    

    当然,编译器会确保您无法访问不是 Grms DbSet 的 Pms DbSet,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2011-10-15
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多