首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Entity Framework4 "Unit of Work“模式是通用存储库的首选吗?

Entity Framework4 "Unit of Work“模式是通用存储库的首选吗?
EN

Stack Overflow用户
提问于 2010-05-12 18:46:51
回答 1查看 2.6K关注 0票数 1

我正在考虑为我正在工作的一个新的ASP.NET MVC项目创建一个实体框架4通用存储库。我一直在看各种教程,它们似乎都使用了Unit of Work模式...

根据我所读到的,EF已经在ObjectContext中使用了它,你只是简单地扩展它来创建你自己的工作单元。

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

为什么要费力这样做呢?这是使用泛型存储库的首选方式吗?

非常感谢,科汉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-13 04:25:32

这不是我使用泛型存储库的方式。首先,我会在当前请求中的ClassARepository、CalssBRepository和其他存储库之间共享ObjectContext。使用IOC容器,建议使用注入和每次请求的行为:

这是我的通用存储库的样子:

代码语言:javascript
运行
复制
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是通过构造函数注入的。List()方法返回IQueryable,以便在业务层(服务)对象中进行进一步处理。服务层返回List或IEnumerable,因此视图中没有延迟执行。

这段代码是使用EF1创建的。EF4版本可以稍有不同,也可以更简单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2818029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档