2011-06-05 22 views
0

假設我在SQL DB中有'客戶'表,並且正在使用實體框架。我是否應該將實體對象類始終稱爲DAL或者我可以使用它的類?

現在,例如,在控制器或視圖模型我檢索由var customer = Page.Current.Customer客戶時,它的代碼是:

public class Page 
{ 
    ... 
    // Customer is EntityObject that created by Entity Framework 
    public Customer Customer 
    { 
     get 
     { 
       return (new ContextEntity()).Customers.First(); 
     } 
    } 
} 

我的問題:

我應該是指實體對象類(客戶)作爲DAL並創建CustomerWrapper,或者我可以在我的應用程序的其他代碼中使用它?

我的意思是,這是正確的,Page.Current.Customer將返回客戶實體或者我應該使用客戶實體爲DAL和Page.Current.Customer應該返回定製的客戶,某種CustomWrapper的?

在一方面,如果意志決定改變客戶表名site_Customer(在SQL數據庫)我會刷新EntityModel,只會在頁面類中的代碼更改爲

public class Page 
    { 
     ... 
     // Customer is EntityObject that created by Entity Framework 
     public Customer Customer 
     { 
      get 
      { 
        return (new ContextEntity()).site_Customers.First(); 
      } 
     } 
    } 

但在另一方面我會有客戶實體+包裝客戶

有什麼更好?

+0

你爲什麼用[s#arp-architecture]標記這個? – autonomatt 2011-06-08 22:46:52

回答

0

這一切都取決於您要在應用程序中使用的抽象級別以及表示層的需求。兩種方法都是可能的。

您的代碼可能已經緊密地結合到實體框架(EntityObject是EF型),它也不能很好地檢驗的(Page.Current可能是靜態的),所以不需要對一些更先進的架構方法和關注點分離的討論。

從您的代碼幾點意見:

  • 語境是一次性的!
  • 重命名數據庫中的任何內容都不應該修改您的類名稱。這是EF映射(EDMX)將實體正確映射到新數據庫名稱的責任。
+0

如果你的意思是使用IoC,那麼我改變了控制器,並且它的.ctor中需要IProject。注意第二點:但是如果我全部使用了我的應用程序(Controller,ViewModels,其他類)** site_Customer **類,並且明天表名更改爲** t_Customer **,所以我需要更改所有** site_Customer **到** t_Customer **。但是,如果我在我的應用程序中使用了某種CustomerWrapper,唯一的變化將是'... t_Customers.First ();' – theateist 2011-06-05 11:40:50

+0

更改表名不會影響您的僅應用程序映射。您的類和實體集不必使用與表相同的名稱。您可以在實體設計器中自定義名稱。 – 2011-06-05 11:55:51

+0

所以,我可以更改表名,然後手動映射它們,對吧? – theateist 2011-06-05 12:00:48

1

EDMX文件中的所有類都是部分類。這意味着你可以通過創建一個新的Class文件來擴展這些類。

例如...

public partial class Customer 
{ 
    // Here are the methods, properties, relationships created by EDMX Wizard. 
} 

在項目的另一個領域,我通常把它放在相同的位置EDMX,您可以添加具有相同簽名的一個新的類文件。

public partial class Customer 
{ 
    // Here are the methods, properties, etc. created by you. 
} 

當項目編譯時,這兩個類將成爲編譯代碼中的一個類。現在,當你改變你的EDMX時,是的,它應該正確映射,但這並不總是如此,因爲EF已知是非常錯誤的(假設在MVC 3中用EF 4.1修復),你可以簡單地改變類名以匹配EDMX和「Voila!」中的任何內容您已將該類的所有自定義添加代碼轉移到新實體對象。這實質上是你的「類包裝器」。

0

如果你想使用WCF,那麼你可能需要創建清晰的POCO來避免很多問題。

如果你想要控制器/視圖模型/頁面/任何單元可測試的,那麼你將需要在存儲庫接口+類中抽象你的EntityContext(見repository pattern)。

如果你只是想做一個快速簡單的不可測試的應用程序,那麼你不需要打擾它。不要忘記在每個請求結束時處理數據上下文。

相關問題