0

我有一个使用实体框架与数据库交互的 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.

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

4

1 回答 1

1

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

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

于 2013-05-14T20:10:56.333 回答