我在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上显示。
答案 0 :(得分:0)
显然,您有两个具有许多相似的属性和方法的类:PmsEntities
和GRMSEntities
。尽管您没有这么说,但我认为这两个类都源自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,