繁体   English   中英

分层体系结构中的实体框架

[英]Entity Framework in Layered Architectures

最近我读过文章“ 分层架构中的实体框架 ”,并写了我们可以通过WCF向客户端发送EF实体。 但是在Stackoverflow上的许多线程中,人们告诉我们在使用WCF时应该使用POCO(DTO)对象。 我有一些问题。

  1. 为什么Microsoft将DataContract属性添加到EF实体? Microsoft是否希望我们在应用程序的各处使用这些对象? 或者这仅适用于非常简单的应用程序和快速开发?

  2. 如果我使用POCO对象,我应该创建自动生成的EF-Entities,POCO-Entities,然后在它们之间使用任何映射库吗? 或者我应该只在我的应用程序的所有组件中使用POCO对象?

  3. 如果我已经拥有自己的业务实体,它有一些方法,并且它应该映射到POCO对象,我应该在哪个层上将POCO-object转换为我的实体(例如,我有持久层,业务逻辑层,服务层(WCF),演示者层(客户端,使用WCF),UI层)? 或者我不应该做我自己的实体?

提前致谢

1.为什么Microsoft将DataContract属性添加到EF实体? Microsoft是否希望我们在应用程序的各处使用这些对象? 或者这仅适用于非常简单的应用程序和快速开发?

一般来说,在服务层中公开您的EF实体是一个坏主意,因为这几乎不会与您的服务层和模型表示相关联。 因此,模型中所做的任何更改都会直接影响您的服务,而不是一个好主意。 您还必须在某个时刻对服务层进行版本控制,因此请避免在服务层中公开EF实体。

2.如果我使用POCO对象,我应该创建自动生成的EF-Entities,POCO-Entities,然后使用它们之间的任何映射库吗? 或者我应该只在我的应用程序的所有组件中使用POCO对象?

您可以在服务层内使用POCO对象,将其与任何底层图层分离(请参阅Automapper,以涵盖Entity-DTO映射成本)。 但您仍然可以在架构中的数据和业务层之间使用自动生成的EF实体。 只是尝试不在数据层不同的其他层中依赖生成的域模型的EF特定功能。 轻松迁移到另一个ORM框架。

如果我已经拥有自己的业务实体,它有一些方法,并且它应该映射到POCO对象,我应该在哪个层上将POCO-object转换为我的实体(例如,我有持久层,业务逻辑层,服务层(WCF),演示者层(客户端,使用WCF),UI层)? 或者我不应该做我自己的实体?

服务层http://msdn.microsoft.com/en-us/library/ms978717.aspx 您将在应用程序的服务器层(持久性,业务,服务和演示者层)之间透明地使用您的域模型,并且唯一需要您进行DTO映射的层是服务层,请参阅问题1.(另外,如果您在演示者层中使用ViewModel -nice idea-您还需要在演示者层中使用POCO映射。

您可以将POCO实体手写并与持久层完全分离。 SDReys是正确的,使用生成的EF实体,因为您的模型很臭。

这是一个简单的POCO模型的粗略布局和支持它的上下文。

public class MyApplicationContext : ObjectContext, IMyApplicationContext {   
    public MyApplicationContext() : base("name=myApplicationEntities", "myApplicationEntities")  
    {
  base.ContextOptions.LazyLoadingEnabled = true;
        m_Customers = CreateObjectSet<Customer>();
        m_Accounts = CreateObjectSet<Account>();
    }

 private ObjectSet<Customer> m_Customers;
 public IQueryable<Customer> Customers {
        get { return m_Customers; }
    }
 private ObjectSet<Account> m_Accounts;
 public IQueryable<Account> Accounts {
        get { return m_Accounts; }
    }

 public Account CreateAccount(Customer customer) {
  var account m_Accounts.CreateObject();
  account.Customer = customer;
  return account;
 }
 public Customer CreateCustomer() {
  return m_Customers.CreateCustomer();
 }

 public void AddAccount(Account account) {
  m_Accounts.AddObject(account);
 }
 public void AddCustomer(Customer customer) {
  m_Customers.AddCustomer(customer);
 }
}

public class Account {
    public int Balance {get;set;}
    virtual public Customer{get;set;}
}

public class Customer {
    public string Name {get;set;}
    virtual public List<Account> Accounts{get;set;}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM