1

J'ai un domaine riche, donc je veux séparer le modèle de domaine du modèle de persistance, ce qui est recommandé par tous les praticiens de la conception guidée par le domaine. Supposons que j'ai un riche modèle de domaine suivant:Entity Framework Mapping à l'objet de domaine

public class Order 
{ 
    Public Guid Id {get; private set;} 
    Public Property1 {get; private set;} 
    Public Property2 {get; private set;} 

    private List<Item> Items; 
    Public AddItem() { } 
    .... 
} 

Ceci est mon transfert de données obect (Entity Framework utilise elle):

public class OrderDTO 
{ 
    public Guid Id {get; set;} 
    Public Property1 {get; set;} 
    Public Property2 {get; set;} 
    ... 
} 

Entity Framework DbContext:

public partial class EntityFrameworkContext : DbContext 
{ 
    ... 
    public virtual DbSet<OrderDTO> Orders{ get; set; } 
    ... 
} 

Repository :

public class OrderRepository : IOrderRepository 
{ 
    private EntityFrameworkContext _context; 
    .... 
    public IQueryable<Order> FindBy(Expression<Func<Order, bool>> predicate) 
    { 
     //how to implement this ?? 
    } 
} 

Comment puis-je implémenter la méthode FindBy ?? Je ne peux pas utiliser _context.Orders.where (prédicat) car le contexte d'encadrement d'entaille fonctionne avec OrderDTO et non avec Order. J'ai besoin d'une cartographie entre Func<Order, bool> à Func<OrderDTO, bool>.

Toute aide serait appriciée.

+0

Désolé mon erreur. Ce devrait être l'ordre. Je l'ai changé maintenant. – Lahmacun

+0

'Entity Framework l'utilise 'que signifie ce troisième mot? – mjwills

+0

J'utilise Automapper pour mapper des entités à DTO. Cependant, dans mon projet, j'ai une couche entre le dépôt et le domaine. Cette couche (couche de service) accepte un DTO, est mappée à une entité et appelle le référentiel. De cette façon, mon référentiel se soucie uniquement des entités et ma vue se préoccupe uniquement des DTO, la couche de service fait le reste. – garethb

Répondre

0

si vous utilisez OrderDTO pour construire l'expression sous-jacente

public class OrderRepository : IOrderRepository 
{ 
    private EntityFrameworkContext _context; 
    .... 
    public IQueryable<Order> FindBy(Expression<Func<OrderDTO, bool>> predicate) 
    { 
     return ConvertToDomainModel(_context.Orders.where(predicate); 
    } 
} 
+0

Cette approche nécessite que le client de OrderRepository connaisse OrderDTO et Order. Le client est le modèle de domaine et je ne veux pas que le modèle de domaine connaisse OrderDTO. Je veux que le modèle de domaine soit ignorant de la persistance. – Lahmacun

+0

votre modèle de domaine ne doit pas contenir 'private EntityFrameworkContext _context;' Cela devrait être dans votre modèle de service ou de persistance – MJK