Как создать трехуровневое решение для платформы Entity - PullRequest
8 голосов
/ 04 мая 2011

Я создал три проекта в решении, одно веб-приложение, две библиотеки классов для DAL и BLL. Создал модель Entity Framework в слое DAL и сослался на библиотеку DAL в проекте BLL.

Когда я вызываю объекты BLL из проекта веб-приложения, у меня возникают проблемы, он говорит, что мне нужно ссылаться на структуру сущностей. Я не хочу никакой зависимости от объектов библиотеки DAL в проекте веб-приложения.

Существуют ли какие-либо конкретные рекомендации по созданию чистого трехуровневого приложения с использованием Entity Framework.

1 Ответ

18 голосов
/ 04 мая 2011

Похоже, что ваш BLL выставляет entity классы, которые вы добавили в DAL.Вам нужно будет создать классы-обертки (то есть POCO) в BLL и вернуть их вместо сущностей из 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);

Это верно для Entity Framework, поставляемой с .NET 3.5SP1, и для Linq-To-SQL, который я немного использовал, может быть верным для последних версий EF, но с Code-First и другими вещами может быть способ избежать этого дополнительного шага Data-Transfer-Object, хотя и с сервис-ориентированнойАрхитектура, DTO, вероятно, лучший путь.

...