2013-05-14 80 views
0

我有一個使用實體框架與數據庫進行交互的asp.net應用程序。獨立於數據庫模式的應用程序

在我現在正在使用的新版本中,我需要將應用程序與數據庫分開,以便它可以用於具有類似數據但不同模式的各種數據庫。 (可用於新客戶)

到目前爲止,這是我的做法,但感覺不對

  • 我從客戶數據庫
  • 我自寫的對象生成的數據實體模型對象我的系統將使用
  • 我寫的概述了接口的所有數據操作返回我的自定義對象
  • 我寫了需要我的客戶對象從連接到他們的數據庫實體框架接口的實現,和負載fi我想將其放入我的自定義對象中。

這感覺不對,因爲現在我有兩組相似的對象。

例子,在這裏我得到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對象。

這感覺不對,因爲現在我有2個類似對象的列表(SalesOrdersJobs),我必須爲每個對象編寫CRUD操作,而不是僅僅使用實體框架。

例如,我有一個頁面,您可以添加新班次。但Shifts表將不同於客戶端到客戶端,並且我所做的更改需要更新客戶端表。那麼,如何編寫可以使用輪班的代碼,但是可以將實體框架與新客戶端的模式交換出來?我需要像班次這樣的東西在一個集合中,我可以用它來綁定一個asp:ListView

這樣做的最聰明的方法是什麼?如何使用實體框架,但獨立於客戶模式,以便我的項目可以重複使用許多數據庫?

+0

你必須詳細說明數據庫之間的實際差異。 –

+0

可以說我有2個客戶。一個有一個員工表,一個有一個員工表。兩者都有類似的數據,但列名不同。對於我的應用程序,我的代碼需要使用具有x個字段的工作人員對象。 如何使用我自己的員工對象編寫我的程序,並且能夠使用客戶端2的實體模型替換客戶端1的實體模型?這是爲了能夠將這一個應用程序用於幾個客戶端,這些客戶端都有不同的數據庫,並且需要我的應用程序直接處理他們的數據。 ex。一種方法返回所有員工在時間範圍內不工作 – nicholmikey

+0

這聽起來像您可以使用代碼優先方法並有條件地使用流暢配置API(如果client1,如果client2)。流利的API讓你控制映射,哪個類映射到哪個數據庫,哪個屬性映射到哪個列。我還沒有嘗試過,但是你不應該在同一個應用程序中定位多個模式。 –

回答

1

您的兩個類似對象確實爲您的架構層執行兩種不同的角色,並且不是多餘的。您正在使用的是域模型(SalesOrders),數據傳輸對象和視圖模型(Jobs)。所以你最終可能會得到3組對象。

AutoMapper這樣的工具可以消除繁瑣的對象到對象映射的很多痛苦。