如何声明仅一个db变量,该变量将显示在Entities1.edmx或Entities2.edmx上

时间:2018-08-08 10:00:58

标签: c# oracle entity-framework

我在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架构。

我如何只声明一个数据库变量,该变量将在PMSEntities.edmx或GRMSEntities.edmx上显示。

1 个答案:

答案 0 :(得分:0)

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

我看到两个解决方案。它们与实体框架无关,只是与简单的面向对象编程无关:或者创建一个类,其中包含两个DbContext中的所有DbSet。从中派生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,