最近我读过文章“The Entity Framework In Layered Architecture”,并且写道我们可以通过WCF向客户端发送EF实体。但是在Stackoverflow上的许多线程中,人们告诉我们在使用WCF时应该使用POCO(DTO)对象。 我有一些问题。
为什么Microsoft会将DataContract属性添加到EF实体? Microsoft是否希望我们在应用程序的各处使用这些对象?或者这仅适用于非常简单的应用程序和快速开发?
如果我使用POCO对象,我应该创建自动生成的EF-Entities,POCO-Entities,然后在它们之间使用任何映射库吗?或者我应该只在我的应用程序的所有组件中使用POCO对象?
如果我已经拥有自己的业务实体,它有一些方法,并且它应该映射到POCO对象,我应该在哪个层上将POCO-object转换为我的实体(例如,我有持久层,业务逻辑层,服务层(WCF),演示者层(客户端,使用WCF),UI层)?或者我不应该自己制作这样的实体?
提前致谢
答案 0 :(得分:3)
1.为什么Microsoft会添加DataContract 归属于EF实体?是否 微软希望我们使用这些 我们到处都是物品 应用程序?或者这只是非常 简单的应用程序和快速 发展?
一般来说,在服务层公开您的EF实体是一个坏主意,因为这几乎不会影响您的服务层和模型表示。因此,模型中所做的任何更改都会直接影响您的服务,而不是一个好主意。您还必须在某个时刻对服务层进行版本控制,因此请避免在服务层中公开EF实体。
2.如果我使用POCO对象,我应该创建自动生成的EF实体, POCO-Entities,然后使用任何 它们之间的映射库?或者我 应该只使用POCO对象 我申请的组成部分?
您可以在服务层内使用POCO对象,将其与任何底层图层分离(请参阅Automapper,以涵盖Entity-DTO映射成本)。但您仍然可以在架构中的数据和业务层之间使用自动生成的EF实体。只是尝试不在数据层不同的其他层中依赖生成的域模型的EF特定功能。轻松迁移到另一个ORM框架。
如果我已经拥有自己的事业 实体,有一些方法,它 应该映射到POCO对象上 我应该转换哪一层 POCO-对象是我的实体(例如, 我有持久层,业务 逻辑层,服务层(WCF), presenter层(客户端,使用WCF),UI 层)?或者我不应该这样做 自己的实体?
服务层http://msdn.microsoft.com/en-us/library/ms978717.aspx。您将在应用程序的服务器层(持久性,业务,服务和演示者层)之间透明地使用您的域模型,并且唯一需要您进行DTO映射的层是服务层,请参阅问题1.(另外,如果您在演示者层中使用ViewModel -nice idea-您还需要在演示者层中使用POCO映射。
答案 1 :(得分:3)
你应该阅读这篇文章,看看EF和POCO是否适合你 Working with POCO Entities (Entity Framework)
答案 2 :(得分:1)
您可以将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;}
}