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?
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é? –
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? –
Cela est vrai, mais la requête doit s'exécuter sur les objets d'origine, et non sur les objets DTO. –