我有一个asp.net应用程序,它使用实体框架与数据库进行交互。
在我现在正在处理的新版本中,我需要将应用程序与数据库分开,以便它可以与具有相似数据但具有不同模式的各种数据库一起使用。 (能够用于新客户)
到目前为止,这是我的方法,但感觉不对
这感觉不对,因为现在我有两套相似的物品。
示例,这里我从客户端数据库获取salesOrders
,并将数据转储到我的自定义Job
对象中:
public List<Job> getJobs()
{
List<Job> jobs = new List<Job>();
using (var context = new TBDIEntities.TBDIEntities())
{
//get all future events that are not cancelled
List<SalesOrder> salesOrders = context.SalesOrders
.Where(c => c.EVENTCONFIRMATION != "CANCELLED" && c.FUNCTIONDATE >= DateTime.Now)
.ToList<SalesOrder>();
jobs.AddRange(from order in salesOrders
let dateTime = order.FUNCTIONSTARTTIME
where dateTime != null
select new Job
{
Description = order.FUNCTIONTYPE,
StartTime = (DateTime)dateTime,
Id = order.SALESORDERREF_TXNID.ToString(),
ShiftGroups = new List<ShiftGroup>(),
Status = order.EVENTCONFIRMATION,
ShiftCount = (int)context.BSS_ShiftListView
.Count(c => c.SALESORDERREF_TXNID == order.SALESORDERREF_TXNID),
ConfirmedShifts = (int)context.BSS_ShiftListView
.Count(c => c.SALESORDERREF_TXNID == order.SALESORDERREF_TXNID && c.Confirmed != null),
Client = new Client { Name = order.CustomerRef_FullName }
});
}
return jobs;
}
所以我创建了一个新的上下文,获取了salesOrders
的集合(客户端数据库中的表名),然后从salesOrders
获取数据并创建新的Job
对象(我编写的应用程序将与之交互的对象)并返回Job
个对象。
这感觉不对,因为现在我有2个类似对象列表(SalesOrders
和Jobs
),我必须为每个对象编写CRUD操作,而不是仅仅使用实体框架。
示例,我有一个页面,您可以在其中添加新班次。但Shifts
表将因客户端而异,我所做的更改需要更新客户端表。那么我如何编写可以使用移位的代码,但是可以将实体框架与新客户端的模式交换出来?我需要像移动这样的东西在一个集合中,我可以用它来数据化asp:ListView
。
这样做最聪明的方法是什么?我如何使用实体框架但独立于客户架构,以便我的项目可以重用于许多数据库?
答案 0 :(得分:1)
您的两个类似对象实际上为您的架构层执行了两个不同的角色,并不是多余的。您正在使用的是域模型(SalesOrders
),数据传输对象和视图模型(Jobs
)。所以你最终可能会得到3组对象。
像AutoMapper这样的工具消除了繁琐的对象到对象映射的痛苦。