2011-06-05 72 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)。

如果你只是想做一个快速简单的不可测试的应用程序,那么你不需要打扰它。不要忘记在每个请求结束时处理数据上下文。

相关问题