EF4 CTP5 的存储库模式

2024-01-03

我正在尝试使用 ef4 ctp5 实现存储库模式,我想出了一些东西,但我不是 ef 方面的专家,所以我想知道我所做的是否是好事。

这是我的数据库上下文

public class Db : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}

和存储库:(简化)

public class Repo<T> : IRepo<T> where T : Entity, new()
{
        private readonly DbContext context;

        public Repo()
        {
            context = new Db();
        }

        public IEnumerable<T> GetAll()
        {
            return context.Set<T>().AsEnumerable();
        }

        public long Insert(T o)
        {
            context.Set<T>().Add(o);
            context.SaveChanges();
            return o.Id;
        }
}

您需要退一步思考存储库应该做什么。存储库用于检索记录、添加记录和更新记录。您创建的存储库几乎无法处理第一种情况,处理第二种情况但效率不高,并且根本不处理第三种情况。

大多数通用存储库都有一个类似于

public interface IRepository<T> where T : class
{
    IQueryable<T> Get();
    void Add(T item);
    void Delete(T item);
    void CommitChanges();
}

为了检索记录,您不能只使用AsEnumerable()因为这会将该表的每个数据库记录加载到内存中。如果您只想要用户名为username1,您不需要下载数据库的每个用户,因为这将对数据库性能造成很大的影响,并且对客户端性能造成很大的影响,但根本没有任何好处。

相反,正如您从我上面发布的界面中看到的,您想要返回一个IQueryable<T>目的。IQuerable允许调用存储库的任何类使用 Linq 并向数据库查询添加过滤器,并且一旦 IQueryable 运行,它就完全在数据库上运行,只检索您想要的记录。数据库在排序和过滤数据方面比您的系统要好得多,因此最好在数据库上尽可能多地进行操作。

现在关于插入数据,您有正确的想法,但您不想调用SaveChanges()立即地。原因是最好打电话Savechanges()在所有数据库操作都已排队之后。例如,如果您想在一个操作中创建一个用户及其个人资料,则不能通过您的方法,因为每个Insert调用将导致数据被插入到数据库中。

相反,你想要的是分离出Savechanges()呼叫进入CommitChanges方法我上面有。

这也需要处理数据库中的数据更新。为了更改实体的数据,实体框架会跟踪它收到的所有记录并监视它们以查看是否进行了任何更改。但是,您仍然需要告诉实体框架将所有更改的数据发送到数据库。这种情况发生在context.SaveChanges()称呼。因此,您需要将其作为单独的调用,以便能够实际更新已编辑的数据,而当前的实现无法处理这些数据。


Edit: Your comment made me realize another issue that I see. One downfall is that you are creating a data context inside of the repository, and this isn't good. You really should have all (or most) of your created repositories sharing the same instance of your data context.

实体框架会跟踪在哪个上下文中跟踪实体,并且如果您尝试用另一个上下文更新一个上下文中的实体,则会出现异常。当您开始编辑彼此相关的实体时,这种情况可能会发生。这也意味着您的SaveChanges()调用不是事务性的,每个实体都在其自己的事务中更新/添加/删除,这可能会变得混乱。

我在存储库中对此的解决方案是DbContext被传递到构造函数中的存储库中。

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

EF4 CTP5 的存储库模式 的相关文章

  • C# 通过实体框架调用 SQL Server 用户定义的函数

    我不敢相信我必须问这个问题 但我被困住了 我花了三个小时试图解决这个问题 但我被困住了 我可以在以前版本的 C 中执行此操作 但我卡住了 在继续之前 我正在研究堆栈 视觉工作室2012 SQL Server 2012 NET Framewo
  • 实体框架与oracle数据库的连接

    我使用的是 Entity Framework 6 1 版本和 oracle 11 我是实体框架的新手 任何人都可以建议连接 oracle 的先决条件是什么 任何更改都需要在 web config 中进行 在web config中 默认它是与
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • OS X Server - 机器人无法从存储库获取源代码

    我安装了以前版本的 OS X Server 并且运行良好 但是当我安装升级到 3 2 1 时 我发现我的机器人都无法正常工作 这些是我在每次尝试集成时遇到的问题 构建服务错误无法将数据放入缓冲区 1 构建服务警告由于找不到工作副本 源代码管
  • 实体框架 6 - 使用我的 getHashCode()

    这篇文章需要了解一定的背景知识 请耐心等待 我们有一个使用 EF 的 n 层 WPF 应用程序 我们通过 dbContext 将数据从数据库加载到 POCO 类中 dbContext 被销毁 然后用户可以编辑数据 我们使用 Julie Le
  • EF6“模型配置”已设置但未发现

    我有以下库 实体模型 dll 包含 POCO 类 实体DAL dll 引用EntityMODEL dll 实体服务 dll 引用 EntityMODEL dll 和 EntityDAL dll 实体测试 dll 引用 EntitySERVI
  • 实体框架中 1:1 关系中关联的主体端意味着什么

    public class Foo public string FooId get set public Boo Boo get set public class Boo public string BooId get set public
  • 在实体框架中对连接字符串进行硬编码

    我知道很多人认为对连接信息进行硬编码是一个坏主意 但我有一个特定的情况需要这样做 请不要贬低我 因为你认为这是一个坏主意 再次 非常具体的情况 使用下面的代码 我在 LINQ 语句上收到以下错误 底层提供程序在打开时失败 我已经独立测试了连
  • 实体框架-实体映射问题

    我有两个表 地址和联系人 它们在 contactID 上连接 在联系人中 这两个表在我的实体数据模型 EF 4 0 中都有实体 我不想修改它们 我确实想创建一个包含两个实体信息的新实体 到目前为止我做了什么 In CSDL
  • 为什么实体框架尝试选择所有列,即使我只指定了两列?

    我继承了一个 ASP MVC 项目 该项目使用 Entity Framework 6 1 3 与 Dynamics CRM 2011 SQL 数据库进行交互 我正在使用此查询来尝试获取具有帐号的所有活动帐户 并且我仅选择两列为匿名类型 va
  • 如何使用 EF Code First 将一张表与多个父项关联

    我正在构建一个域模型 该模型需要多个表才能被多个可能的父表引用 像您可能有一个表来存储注释或文件 并且这些注释和 或文件可以与不同的父实体关联 并不是说同一个 文件 或 注释 可以与多个所有者相关联 而是 文件 表中的 10 行中 其中 3
  • 实体框架在不同的工作站上生成不同的查询

    我们在单个开发人员机器和一些客户端上遇到问题 单个 Linq 查询 生成两个不同的 SQL 查询 问题实际上是第二个查询有 firebird 不支持的 OUTER APPLY 语句 我们认为这不是代码问题 而是环境问题 但我会粘贴代码 li
  • 使用 linq-to-entities 将字符串转换为日期时间的大问题

    如何使用 linq toEntity 将字符串转换为日期时间 我收到以下查询 其中visit date列数据类型是字符串 var memberl from v in abc visits join m in abc members on v
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 抑制实体框架核心中的 SQL 查询日志记录

    我有一个使用实体框架核心的控制台 net core 应用程序 该应用程序使用日志框架写入文件和控制台 serviceProvider new ServiceCollection AddLogging AddDbContext
  • 如何使用 Entity Framework Code First 在两个实体之间建立多个一对多关系

    下面是保存关系数据库记录的简单方法 该方法运行得很好 我对一种情况有疑问 在此之前 我需要知道如果数据库复杂性增加 我所采用的方法会遇到什么困难 还有更好 高效但简单的方法吗 一对一 tb student store student det
  • 不支持 EF6 上下文类型“System.Data.Entity.Core.Objects.ObjectContext”

    我有一个使用 Visual Studio 2013 和 ADO NET 实体数据模型 EF6 创建的新项目 现在我必须使用一些动态数据函数 例如访问 MetaTable 对象 所以我添加以下代码 MetaModel model new Me
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 如何从 Docker Hub 删除存储库

    如何从 Docker Hub 完全删除存储库 Docker 正在快速发展 他们的网站也是如此 这是从 docker hub Web 界面删除存储库的最新方法 首先 确保您已登录 hub docker com Simple 单击顶部的存储库链
  • 从备用位置获取实体框架连接字符串?

    如何从自定义配置文件而不是 web config 检索 Entity Framework 4 连接字符串 编辑 删除默认构造函数生成的代码并在分部类中重新创建它以使用拉入的连接字符串是否合理 我真的很想避免使用包括连接字符串在内的重载方法更

随机推荐

  • 使用 Angular HTTP 拦截器管理多个同时异步服务调用的加载器/旋转器

    我已经实现了 Http 拦截器 并在服务启动时显示微调器 并在服务成功 失败时隐藏微调器 代码示例 intercept req HttpRequest
  • PHP 搜索结果分页

    我如何按以下方式格式化页面 例如 我的搜索结果提供了 50 页的数据 然后我想要这种格式的页面 第1页 第2页 第3页 第4页 第5页 第50页 另外 当我单击 时 结果应该从第 6 页返回 页面列表应该类似于 第 1 页 第 5 页 第
  • Today Widget Extension 中经常出现“无法加载”的情况

    我正在为我的应用程序制作一个 今日 小部件 我的小部件包含一个包含 10 个单元格的 UITableView 每个单元格的高度为50pt 功能简单 如果我触摸单元格上的按钮 则从 sqlite 重新加载数据库并将它们显示在单元格上 它在模拟
  • iframe 和 Javascript 完成后 WebBrowser 控制文档完成

    我需要捕获生成的 HTML 图像 我正在使用 Alex Filipovici 的出色解决方案 将 HTML 字符串转换为图像 https stackoverflow com questions 17832304 convert html s
  • 仅当 PropertyName 未在 Json.Net 中显式设置时才使用驼峰命名法?

    我的网站使用 Json Net 我希望序列化程序默认以驼峰命名法序列化属性名称 我不希望它更改我手动分配的属性名称 我有以下代码 public class TestClass public string NormalProperty get
  • 访问 django admin 内联模型中的请求对象

    我有以下模型 表单 管理层次结构 我想要实现的基本上是将当前登录的用户添加到 AttachmentInlines 的字段中 所以我想我需要在几个方法中传递的请求对象 在下面实现 但是 在这种情况下 这些方法都不会被调用 显然是因为我正在使用
  • 两个物体之间的夹持

    I need grip between two objects actually small cube is a player having rigid body and big cube is an object that helps s
  • Android Studio WebView中的文件上传

    我想允许我的 WebView Android 应用程序使用上传按钮 由于我不是 Android 开发人员 因此我需要您的帮助来为 Android WebView 启用图像上传器 这是我的 MainActivity 文件 package co
  • 使用 XSLT 将 XML 转换为 CSV

    我有以下 XML 文档
  • 如何让 ¤ 按字面显示,而不是显示为 HTML 实体

    我正在使用 php 查看其中包含 URL 的 XML 文件 URL 看起来像这样 当我回显 URL 时 curren 显示为 又名 164 A4 或货币符号 并且链接不起作用 即使没有结束分号 也会发生这种情况 使 curren 按字面显示
  • 从 2 列 ComboBox VBA 检索两个值

    我有一个用户表单 excel VBA 其中有一个 2 列组合框 当用户从组合框中选择某个值时 我想获取他选择的值以及与第一个值关联的值 即第二列值 我该怎么做呢 简单地ComboBox1 Value返回第一列的值 ComboBox1 Val
  • 如何在子文件夹/包中使用 Go 1.16 嵌入功能?

    Go 1 16 已发布 我想使用新的嵌入功能 如果所有内容都在主包中 我就可以让它工作 但尚不清楚如何处理从子文件夹 包访问资源 尝试通过 embed FS 支持来做到这一点 例如我有一个 main go 并且在处理程序包 文件夹中还有一个
  • 获取属性的值

    这是我的 XML
  • 如何在Java运行时创建动态类

    在运行时更改现有 Java 文件的某些属性后 是否可以从现有 Java 文件创建新的 Java 文件 假设我有一个java文件 public class Student private int rollNo private String n
  • 选择 SQL Server 数据库大小

    我怎样才能查询我的sql服务器只获取数据库的大小 我用过这个 use MY DB exec sp spaceused 我懂了 database name database size unallocated space My DB 17899
  • 以数组形式返回 sql 查询

    我正在使用 jqueryui 及其自动完成插件 它使用 json 来提取项目 我想修改它 以便从我的数据库中提取项目 物品应该是这样的 items array Great em Bittern em gt Botaurus stellari
  • 检查文本是否为 HTML

    我正在使用 Meteor 我正在尝试检查文本是否为 html 但通常的方法不起作用 这是我的代码 post function var postId Session get postId var post Posts findOne id p
  • RGB 到 HSI 以及 HSI 到 RGB 转换

    我正试图掩饰RGB to HSI并恢复它 该任务需要从头开始 In RGB to HSI转换 饱和度和强度输出都很好 但我似乎没有明白Hue的表述有什么问题 示例输出 Red 255 Green 255 Blue 255 Hue 21474
  • Nginx LetsEncrypt 错误“/etc/letsencrypt/options-ssl-nginx.conf”没有这样的文件或目录

    我正在尝试使用 LetsEncrypt 和 Nginx 添加 https 我已经添加了 certbot 并且它运行成功 然后 当尝试运行 Nginx 服务器时 我收到此错误 docker entrypoint sh docker entry
  • EF4 CTP5 的存储库模式

    我正在尝试使用 ef4 ctp5 实现存储库模式 我想出了一些东西 但我不是 ef 方面的专家 所以我想知道我所做的是否是好事 这是我的数据库上下文 public class Db DbContext public DbSet