应用独立于数据库模式

时间:2013-05-14 19:16:05

标签: asp.net entity-framework

我有一个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个类似对象列表(SalesOrdersJobs),我必须为每个对象编写CRUD操作,而不是仅仅使用实体框架。

示例,我有一个页面,您可以在其中添加新班次。但Shifts表将因客户端而异,我所做的更改需要更新客户端表。那么我如何编写可以使用移位的代码,但是可以将实体框架与新客户端的模式交换出来?我需要像移动这样的东西在一个集合中,我可以用它来数据化asp:ListView

这样做最聪明的方法是什么?我如何使用实体框架但独立于客户架构,以便我的项目可以重用于许多数据库?

1 个答案:

答案 0 :(得分:1)

您的两个类似对象实际上为您的架构层执行了两个不同的角色,并不是多余的。您正在使用的是域模型(SalesOrders),数据传输对象和视图模型(Jobs)。所以你最终可能会得到3组对象。

AutoMapper这样的工具消除了繁琐的对象到对象映射的痛苦。