2011-07-27 3 views
0

Je suis strugling avec cadre d'entité où j'ai fait une bibliothèque avec Business Objects (par exemple, compte) qui sont utilisés dans tout le système.Entity Framework - Interroger un adaptateur

public class Account 
{ 
    public long AccountId { get; set; } 
    public string AccountText { get; set; } 
} 

Le cadre de l'entité est ensuite transformer ces avant et en arrière quand ils sont demandés ou nécessaires pour sauver

public interface EntityAdapter<T> { 
    T Materialize(long id); 

    long Dematerialize(T business); 
    void Dispose(T business); 
} 

public abstract class EFEntityAdapter<T> : EntityAdapter<T> { 
    private static MyModel.MyEntities __ctx = null; 
    protected MyModel.MyEntities _context 
    { 
     get 
     { 
      if (__ctx == null) 
      { 
       __ctx = new MyModel.MyEntities(); 
      } 
      return __ctx; 
     } 
    } 

    public abstract T Materialize(long id); 
    public abstract long Dematerialize(T business); 
    public abstract void Dispose(T business); 
} 
public class AccountEntityAdapter : EFEntityAdapter<CommonLib.BusinessModels.Account> 
{ 
    public override CommonLib.BusinessModels.Account Materialize(long id) 
    { 
     Account entity = (from account in _context.Accounts 
          where account.AccountId == id 
          select account).FirstOrDefault(); 

     if (entity == null) 
      return null; 

     CommonLib.BusinessModels.Account business = new CommonLib.BusinessModels.Account(); 

     business.AccountId = entity.AccountId; 
     business.AccountText = entity.AccountText; 

     return business; 
    } 

    public override long Dematerialize(CommonLib.BusinessModels.Account business) 
    { 
     long id = business.AccountId; 

     Account entity = (from account in _context.Accounts 
          where account.AccountId == id 
          select account).FirstOrDefault(); 

     if (entity == null) 
     { 
      if (id > 0) 
      { 
       throw new Exception("Account with id: " + id + " does not exists"); 
      } 
      else 
      { 
       entity = new Account(); 
       _context.Accounts.AddObject(entity); 
      } 
     } 

     entity.AccountId = business.AccountId; 
     entity.AccountText = business.AccountText; 
     _context.SaveChanges(); 
     business.AccountId = entity.AccountId; 
     return entity.AccountId; 
    } 

    public override void Dispose(CommonLib.BusinessModels.Account business) 
    { 
     long id = business.AccountId; 

     Account entity = (from account in _context.Accounts 
          where account.AccountId == id 
          select account).FirstOrDefault(); 

     if (entity == null) 
     { 
      throw new Exception("Account with id: " + id + " was not found, but an attempt to delete it was done"); 
     } 

     _context.DeleteObject(entity); 
     _context.SaveChanges(); 
    } 
} 

Mais maintenant, je voudrais utiliser l'adaptateur avec LINQ tel que je suis en mesure de faire quelque chose comme

AccountEntityAdapter a = new AccountEntityAdapter(); 
List<Commonlib.BusinessModels.Account> list = (from account in a 
               where account.AccountId > 6 
               select account).ToList(); 

tel que je suis libre du contexte entité ...

Comment puis-je y parvenir?

+0

Vous êtes en train de réinventer une roue. Abandonnez et utilisez vos entités en tant qu'objets métier. Quel est le point d'une telle complexité? –

+0

Pour autant que je sache, les objets d'entité ne peuvent pas être supprimés du domaine de l'application, et si je veux transférer l'information à un autre endroit et ensuite le retourner avec quelques changements, je dois utiliser d'autres objets? –

+0

Cela est vrai, mais la requête doit s'exécuter sur les objets d'origine, et non sur les objets DTO. –

Répondre

1

Sur la base de vos commentaires les options pour vous sont soit:

  • projection Faire directement dans les entités LINQ-à-requête au lieu d'utiliser mappeur
  • Interrogation vos entités, appelez .ToList et exécuter LINQ-to requête d'objet sur le résultat avec projection à l'aide de votre mappeur
0

Vous avez besoin d'un contexte pour vous connecter à votre base de données. Cependant, cela est généralement encapsulé dans un référentiel et contenu dans un emplacement central à utiliser plutôt que de créer un contexte par action.

+0

Je sais, mais au moment où j'utilise l'EntityAdapters, je voudrais qu'ils retournent mes objets métier au lieu des objets d'entité. Le contexte est là, mais je veux que la conversion se fasse automatiquement –