Est-Entity Framework 4 « unité de travail » modèle le chemin à parcourir pour les dépôts génériques?

StackOverflow https://stackoverflow.com/questions/2818029

Question

Je cherche à créer un Entity Framework 4 référentiel générique pour un nouveau projet ASP.NET MVC je travaille. J'ai cherché à divers tutoriels et ils semblent tous d'utiliser l'unité de travail modèle ...

D'après ce que je lis, EF utilise ce déjà dans le ObjectContext et vous étendez simplement cela pour faire vos propres unités de travail.

Source: http://dotnet.dzone.com/news/using-unit-work-pattern-entity?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+zones%2Fdotnet+ (.NET + Zone)

Pourquoi voudrait-on aller à l'effort de le faire? Est-ce le meilleur moyen de travailler avec des référentiels génériques?

Merci, Kohan.

Était-ce utile?

La solution

Ce n'est pas la façon dont je travaillerais avec des référentiels génériques. Tout d'abord, je voudrais partager entre ObjectContext ClassARepository, CalssBRepository et d'autres dépôts dans la demande actuelle. L'utilisation contenant du CIO, par injection et par le comportement de la demande est recommandée:

Voici comment mes dépôts génériques ressemblent:

public interface IRepository<T>
{
    //Retrieves list of items in table
    IQueryable<T> List();
    IQueryable<T> List(params string[] includes);
    //Creates from detached item
    void Create(T item);
    void Delete(int id);
    T Get(int id);
    T Get(int id, params string[] includes);
    void SaveChanges();
}

public class Repository<T> : IRepository<T> where T : EntityObject
{
    private ObjectContext _ctx;

    public Repository(ObjectContext ctx)
    {
        _ctx = ctx;
    }


    private static string EntitySetName
    {
        get
        {
            return String.Format(@"{0}Set", typeof(T).Name);
        }
    }

    private ObjectQuery<T> ObjectQueryList()
    {
        var list = _ctx.CreateQuery<T>(EntitySetName);
        return list;
    }

    #region IRepository<T> Members

    public IQueryable<T> List()
    {
        return ObjectQueryList().OrderBy(@"it.ID").AsQueryable();
    }

    public IQueryable<T> List(params string[] includes)
    {
        var list = ObjectQueryList();

        foreach(string include in includes)
        {
            list = list.Include(include);
        }

        return list;
    }

    public void Create(T item)
    {
        _ctx.AddObject(EntitySetName, item);
    }

    public void Delete(int id)
    {
        var item = Get(id);
        _ctx.DeleteObject(item);
    }

    public T Get(int id)
    {
        var list = ObjectQueryList();
        return list.Where("ID = @0", id).First();
    }

    public T Get(int id, params string[] includes)
    {
        var list = List(includes);
        return list.Where("ID = @0", id).First();
    }

    public void SaveChanges()
    {
        _ctx.SaveChanges();
    }

    #endregion

}

ObjectContext est injecté par le constructeur. méthodes de retour Liste () IQueryable pour un traitement ultérieur dans les objets couche métier (service). retourne couche de service Liste ou IEnumerable, donc il n'y a pas d'exécution différée dans les vues.

Ce code a été créé à l'aide EF1. la version EF4 peut être un peu différent et plus simple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top