2011-05-03 2 views
7

J'ai créé trois projets dans une solution, une applciation Web, deux bibliothèques de classes pour DAL et BLL. Créé le modèle Entity Framework dans la couche DAL et référencé la bibliothèque DAL dans le projet BLL. Lorsque j'appelle les objets BLL du projet d'application Web en cours d'exécution, je dois référencer le framework d'entité. Je ne veux aucune dépendance sur les objets de bibliothèque DAL dans le projet d'application Web.Comment créer une solution à trois niveaux pour Entity Framework

Existe-t-il des instructions spécifiques sur la création d'une application à trois niveaux propre à l'aide d'Entity Framework?

Répondre

17

Des sons comme votre BLL exposent les classes entity que vous avez ajoutées dans le DAL. Vous aurez besoin de créer des classes wrapper (qui sont POCO) dans la BLL et de renvoyer celles-ci à la place des entités de la DAL.

Ceci est probablement ce que vous sont faire:

// 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); 

C'est probablement ce que vous devriez accomplirez:

// 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); 

Cela est vrai pour Entity Framework livré avec. NET 3.5SP1 et pour Linq-To-SQL que j'ai utilisé un peu, il peut être vrai pour les dernières versions de EF, mais avec Code-First et d'autres choses, il peut y avoir un moyen d'éviter ce Data-Trans supplémentaire étape Fer-Object, mais avec une architecture orientée services, les DTO sont probablement la meilleure façon de procéder.

+0

Merci @Nate, l'objet de transfert de données a été manqué et a eu des ennuis. – inlokesh

Questions connexes