【问题标题】:Entity Framework 4.0 with POCO classes - Repository pattern?带有 POCO 类的实体框架 4.0 - 存储库模式?
【发布时间】:2010-10-28 17:46:52
【问题描述】:

我正在使用 Entity Framework 4.0 编写一个 asp.net mvc 2 Web 应用程序。我有应该显示项目的视图、用于登录的视图等。我应该使用存储库模式来构建项目吗?如果是,如何?我应该为添加、更新、删除等基本方法和另一个使用存储库的常见方法(如登录验证等)的类创建一个接口吗?

【问题讨论】:

    标签: asp.net-mvc-2 c#-4.0 entity-framework-4


    【解决方案1】:

    我将 EF 与存储库模式一起使用,它为我节省了大量工作!

    小存储库模式介绍:

    someRepository.Find.Where(something => something.IsRed && something.IsBig)
    

    创建一个名为“IRepository”的通用接口,其类型包含所有数据访问方法。

    它可能看起来像这样:

    interface IRepository<T> where T : class
    {
        IEnumerable<T> FindAll(Func<T, bool> exp);
    
        T FindSingle(Func<T, bool> exp);
    }   
    

    创建一个实现此接口的抽象“存储库”类:

    class Repository<T> : IRepository<T> where T : class
    {
        TestDataContext _dataContext = TestDataContext(); // Would be your EF Context
    
        public IEnumerable<T> FindAll(Func<T, bool> exp)
        {
            _dataContext.GetTable<T>().Where<T>(exp);
        }
    
        public T FindSingle(Func<T, bool> exp)
        {
            _dataContext.GetTable<T>().Single(exp);
        }
    }
    

    我们现在可以为实现我们的“IRepository”的something 表/对象创建一个接口,以及一个扩展抽象“Repository”类并实现“ISomethingInterface”的具体类:

    interface ISomethingRepository : IRepository<Banner>
    {
    }
    

    以及实现它的匹配存储库:

    class SeomthingRepository : Repository<Banner>, IBannerRepository
    {
    }
    

    我建议使用这种方法,因为它为您提供了很大的灵活性以及足够的能力来控制您拥有的所有微小实体。

    这样调用这些方法会超级简单:

    SomethingRepository _repo = new SomethingRepository ();
    
    _repo.Find.Where(something => something.IsRed && something.IsBig)
    

    是的,这意味着您必须做一些工作,但以后更改数据源会更容易。

    希望对你有帮助!

    【讨论】:

    • 我应该如何构建我的应用程序?我实际上在 1 个解决方案中有 3 个项目:第一个是 Web 应用程序,第二个是具有我的自定义功能的框架等,最新的一个实际上仅包含 EDMX 文件,其中包含由实体框架设计器自动生成的 POCO 类
    • 使用实体框架 4.0 我没有 DataContext 类,所以我没有可用的 GetTable 方法...你是如何解决这个问题的?
    【解决方案2】:

    你能得到的最完整的答案可能在这里:

    http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/

    需要阅读和了解的内容很多,但如果您真的想了解如何将存储库模式与 EF 一起使用,那可能是最完整的来源。

    可以在此处找到一些用于快速入门的更简单示例代码:

    http://www.forkcan.com/viewcode/166/Generic-Entity-Framework-40-Base-Repository

    您还可以找到不同的变体 + 讨论(例如,从存储库返回 IQueryable's 是否是个好主意等。

    【讨论】:

    • 你给我的第一个链接 EF4 CTP4 目前是预览版...我可以用吗?
    • CTP 出现在帖子的更新中。这些部分已标记,因此如果您不想安装 CTP,可以按照旧代码(使用 ContextBuilder)。如果您只想重复使用打包的源代码(来自下载),您当然可以安装 CTP。
    • 实际上不确定,他们正在计划上线许可证,但我不知道其状态。您可以在预发布论坛中提问:social.msdn.microsoft.com/Forums/en-US/adonetefx/threads。再说一次,如果你不想使用它,你不必使用它。
    • 我应该将 EF 4 与 POCO 类一起使用,还是将 NHibernate 用于生产应用程序?
    • 这是一个完全不同的问题,它与存储库模式无关——无论您选择哪种 ORM,实现都将非常相似。关于 ORM 比较,EF4 和 nHibernate 各有优劣,都适合生产应用,只能由你自己选择。 dotnetslackers.com/articles/ado_net/…
    猜你喜欢
    • 2011-06-06
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多