我在一个解决方案中创建了三个项目,一个Web应用程序,两个用于DAL和BLL的类库。在DAL层创建了Entity Framework模型,并在BLL项目中引用了DAL库。
当我从Web应用程序项目调用BLL对象遇到问题时,它说我需要引用实体框架。我不想在Web应用程序项目中对DAL库对象有任何依赖。
是否有关于使用Entity Framework构建干净的三层应用程序的具体指导。
答案 0 :(得分:18)
听起来你的BLL暴露了你在DAL中添加的entity
类。您需要在BLL中创建包装类(即POCO)并从DAL中返回这些类而不是实体。
这可能是你 做的事情:
// DAL
// .edmx file generated entities
public IQueryable<TableEntity> GetTableEntities()
{
// read from entity framework and return
}
// BLL
public IEnumerable<TableEntity> ReadTableEntitiesForUser(int userID);
{
var d = new DAL();
var entities = d.GetTableEntities();
// restrict to entites this user "owns"
entities = entities.Where(e => e.OwnerID.Equals(userID));
return entities;
}
// WebApp
var b = new BLL();
var myEntities = b.ReadTableEntitiesForUser(1234);
这可能是你应该做的事情:
// DAL
// .edmx file generated entities
public IQueryable<TableEntity> GetTableEntities()
{
// read from entity framework and return
}
// BLL
public class TableEntityDTO
{
public int ID { get; set; }
public string Name { get; set; }
// continue on for each column in the table
// and make a DTO class for each table in your database
}
public IEnumerable<TableEntityDTO> ReadTableEntitiesForUser(int userID);
{
var d = new DAL();
var entities = d.GetTableEntities();
// restrict to entites this user "owns"
entities = entities.Where(e => e.OwnerID.Equals(userID));
// convert from "Entity Framework Object" to "BLL Object"
foreach(var e in entities)
{
yeild return new TableEntityDTO() { ID = e.ID, Name = e.Name };
}
}
// WebApp
var b = new BLL();
var myEntities = b.ReadTableEntitiesForUser(1234);
对于.NET 3.5SP1和Linq-To-SQL附带的实体框架都是如此,我已经使用了它们,它可能适用于EF的最新版本,但使用Code-First和其他方面可能有一种方法可以避免这种额外的数据传输对象步骤,尽管采用面向服务的体系结构,DTO可能是最好的方法。