实体框架 6 提供开箱即用的存储库和 UoW

2023-11-27

但如何使用它呢?

我有一个Code First项目建立,并尝试使用这个新的 EF6 进行一些操作。阅读至少 2 岁有关 EF4/5 的各种帖子/博客。但对于 EF6 却一无所知。

假设我有这些实体:

public DbSet<Person> Persons { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Invoice> Invoices { get; set; }

我还需要为每个实体创建存储库吗?或者会是class除了 CRUD 之外,用一些方法来进行一些自定义计算就足够了吗?

我知道这一行:

kernel.Bind<MyDbContext>().ToSelf().InRequestScope();

就足够了DI,并且它将通过构造函数注入到适用的上层类。

该项目有一个类库和一个Web项目asp.net-mvc。其中类库项目包含我的实体并且具有Migrations已启用。

非常感谢对此事的任何了解。


我在几个项目中在 EF 之上添加了一个存储库层(它在其构造中本质上利用了存储库和 UoW 模式),并且我使用一个使用泛型的类来完成此操作,因此我只需要一个文件我的所有实体。您可以决定是否要这样做,但我发现它在我的项目中很有用。

我的存储库通常是像下面所示的那样开始的,如果/当我遇到需要它们时,接下来会提供更多扩展方法(显然我不会显示所有扩展方法,这由您决定如何实现)你的存储库)。

public class Repository<T> : IRepository<T> where T : class
{
    protected IDbContext Context;
    protected DbSet<T> DbSet { get { return Context.Set<T>(); } }

    public Repository(IDbContext context = null)
    {
        Context = context ?? new DbContext();
    }

    public void Add(T newRecord)
    {
        DbSet.Add(newRecord);
    }

    public void Update(T record)
    {
        var entry = Context.Entry(record);
        DbSet.Attach(record);
        entry.State = EntityState.Modified;
    }

    public void Remove(T record)
    {
        Context.Entry(record).State = EntityState.Deleted;
        DbSet.Remove(record);
    }

    public IQueryable<T> Where(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Where(predicate);
    }

    public bool Contains(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Count(predicate) > 0;
    }

    public int Count(Expression<Func<T, bool>> predicate)
    {
        return DbSet.Count(predicate);
    }

    public int Save()
    {
        return Context.SaveChanges();
    }
}

我使用存储库有两个主要原因:

  1. 单元测试。执行此模式允许我伪造底层数据,而不必在数据库中包含错误数据。我需要做的只是创建另一个实现IRepository它使用内存中的列表作为其数据源,并且我已准备好我的页面来查询该存储库。

  2. 可扩展性。很多次我将一些方法放入我的存储库中,因为我发现自己不断地在控制器中对查询执行相同的逻辑。这非常有用,特别是因为您的客户端代码不需要知道它是如何做的,只需知道它正在做(如果您需要更改一个文件与多个文件的逻辑,这将变得更容易) )。

显然,这不是全部,但这对于这个答案来说应该足够了。如果您想了解更多关于这个主题的信息,我确实写了一篇博客文章,您可以可以在这里找到.

无论您决定做什么,祝您好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 6 提供开箱即用的存储库和 UoW 的相关文章

  • TransactionScope - 底层提供程序在 EnlistTransaction 上失败。 MSDTC 正在中止

    我们的团队遇到了一个问题 表现为 底层提供者在 EnlistTransaction 上失败 无法访问 已处置对象 对象名称 事务 这似乎是我们一开始使用就出现的交易范围 http msdn microsoft com en us libra
  • 多态 MVC 视图

    因此 我在 ASP NET MVC 中制作一个注册页面 其中有一个字段列表 该列表会根据许多条件 从数据库中获取 而变化 在每次更新数据库时不更改代码的情况下 在视图上显示这些字段的最佳方法是什么 我正在考虑的当前系统是制作一个带有 名称
  • 在 MVC 3 中,我无法让 @Html.DisplayFor 呈现格式化字符串

    我希望这是一个非常简单的问题 尽管经过大量谷歌搜索后 我还没有能够解决这个问题 我正在使用 MVC 3 开发一个购物车网站 并使用代码优先的实体框架 我发送的模型是 Product 对象的列表 每个对象都包含此属性 Required Err
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 如何在 MVC Core 中动态选择控制器

    我遇到的情况是 站点可能需要链接来根据数据库结果重定向到某些控制器 例如 site com abcd 需要从项目控制器返回结果 通常称为 item view 123 这里的关键是我不能将 abcd 硬编码到路由中 有些链接可能会转到项目控制
  • 在 SignOut() 之后使用浏览器的后退按钮允许访问安全页面 (ASP.NET MVC)

    我有一个 MVC 应用程序 它使用 Authorize 来保护私有位 当我选择 SignOut URL 时 它会将我注销 但如果我点击浏览器上的后退按钮 它会转到安全页面 甚至允许我使用该表单 该操作发生 然后显示我已退出 问题是它执行安全
  • MVC Core使用ajax发布数据并刷新页面上的某个部分

    我正在开发 AspNet Core 2 0 MVC 网站 问题是 我在一个页面中有 2 个表单 第一个表单用于提交模型 这是通过以下操作完成的 HttpPost public IActionResult AddProductToSale F
  • 当结合 asp.net 动态数据和 MVC MetaModel.Visible 包含 Scaffold==false 的表时

    我通过创建一个新的 DD 项目并添加 MVC 内容 引用 路由 使用等 来组合 MVC 和 DD default aspx 来自 DD 上的表列表将显示所有表 包括带有 ScaffoldTable false 的 Scaffold true
  • 如何在网站上重新创建电子表格或共享点数据表视图?

    我正在尝试将用户从共享点解决方案迁移到网站 SQL 后端 一件事是每个人似乎都喜欢共享点视图和数据表视图来编辑和管理信息 什么是最好的电子表格 访问数据编辑解决方案 是否有任何第三方 ASP NET MVC 小部件是很好的替代品 Teler
  • ASP .NET MVC 5 - 客户地址一对一关系

    我在这里查看了论坛 实际上发现了一些类似的问题 但不是相同的问题 类似的解决方案没有给我正确的答案 我正在使用实体框架和代码优先方法来处理 ASP NET MVC 5 我想建立客户 gt 地址一对一关系的模型 我建模的是 客户等级 publ
  • 外部组件中的控制器上的 404

    我在解决 Asp Net MVC 4 项目中的 404 响应时遇到问题 它是在 VS2012 中构建的 目标版本为 4 5 我已将预编译的视图和控制器内置到独立的 DLL 中 我能够动态加载 DLL 并从我的核心项目中检查它们 甚至调用它们
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • asp.net MVC ModelState.IsValid 返回 false

    我正在开发 ASP NET MVC 应用程序 我有一个视图模型如下 public class SampleInterestViewModel Properties defined One such property that shows a
  • 如何让 ASP.NET MVC 遵守我的自定义错误设置?

    在 web config 的 customErrors 标记中 我指向一个控制器 在我的控制器中 我重定向到由多个应用程序共享的外部错误页面
  • 如何更改隔离级别?

    我正在使用 EF 4 0 并且我想使用隔离级别serializable 因为在事务中我想在读取时阻止寄存器 好吧 在 SQL Server 中 我尝试使用以下命令更改隔离级别 SET TRANSACTION ISOLATION LEVEL
  • 将多对多关系与实体框架中的属性映射

    我总是使用属性将实体的属性映射到相应的列 这是一个例子 Table news entries public class News Key public int Id get set Column d date public DateTime
  • 我们可以使用枚举作为类型安全的实体 ID 吗?

    我们正在 EF 6 1 代码优先设置中使用一个相当大的模型 并且我们使用整数作为实体 id 不幸的是 这并不像我们希望的那样类型安全 因为人们很容易混淆 id 例如比较不同类型的实体的 id myblog Id somePost Id 或类
  • 为什么Asp.net MVC4不能使用SQL Server Session状态存储的cookieless

    全部 这是我在 Asp net MVC4 应用程序中的 Web 配置 我发现如果我将 cookieless 设置为 false 一切都会正常 但如果我不想使用 cookie 那么应用程序就无法工作 当我调试应用程序时 我发现控制器无法接收来
  • 在使用实体框架的分层架构中,我应该从 BLL 返回 POCO 类吗? (需要架构指导)

    我可能读得太多了 并且遭受了一些信息超载的困扰 所以我希望得到一些明确的指导 根据我收集的信息 我可以使用 VS2010 的 T4 模板来生成不直接与 EF 绑定的 POCO 类 我会将这些放在他们自己的项目中 而我的 DAL 将有一个 O
  • 如何通过 jQuery 加载部分视图?

    我正在尝试使用 jQuery 加载部分视图 正在从 Contact cshtml 加载部分视图 然而 在 Chrome 中 当我尝试加载partialViewName cshtml 时 我不断收到 404 错误 我有以下文件夹结构 View

随机推荐