我正在迁移旧版应用程序,以从执行原始SQL过渡到使用ORM。数据库的设计是,很少有实体(例如“帐户”,“交易”,“客户”)具有带有附加字段的相应表(购买我们应用程序的每个客户-始终托管在内部,具有唯一的一组字段),并且这些实体由列构成(叹息) )。因此,对于“事务”,您具有表TransExt,并且如果我们应用程序的客户希望其他字段为例如Description1和Description2,则表TransExt将具有3列,即TransactionId,Description1,Description2。我想要的是轻松管理写和读它们(仅是基本操作),抽象出客户数据库的差异。
由于40个表中只有5个不是恒定的,因此对我来说,创建一个大型DbContext和几个较小的DbContext(其中每个客户端更改表都在其中)将小DbContext注入到大表中是有意义的。这将为我们提供一种简便的方法来为所有客户端更改其他表,并分别为每个客户端更改那些“动态”表。我将较小的DbContext注入主要对象,具体取决于带有我们客户名称的app.config值,并且效果很好。但是,injectedContext仅具有元数据(这很有意义)。如何使用它们来运行更新/读取?
主DbContext具有InjectionDbContext的公共属性(在构造函数中)。没什么可看的。注入的上下文是ClientExtContext。 我可以像
那样使用它们var db = new MainDbContext();
//db.constantTable //works
//db.ClientExtContext.TransExt //doesn't
var list = db.ClientExtContext.Model.GetEntityTypes().ToList() //shows a list of object mapped to tables like TransExt, AccountsExt
list.ElementAt(7).GetProperties().ToList(); //gives me list of objects mapped to fields like Description1, Description2
我想要对它们进行操作。例如
var db = new MainDbContext();
var list = db.ClientExtContext.Model.GetEntityTypes().ToList()
var fieldsList = list.ElementAt(7).GetProperties().ToList();
list.where(s=>s.Name=="TransExt").Where(string.Format("{0} = {1}",fieldsList.ElementAt(0),someId) //this would give me TransExt row with someId, since fieldsList.ElementAt would point at column Id, using dynamic Linq
.Update(fieldsList.ElementAt(1), someDescription1Value); //first column which is Description1
db.SaveChanges();
也许是更好的设计?