如何在实体框架中使用数据库优先方法来使用存储库模式

2024-03-28

如何在实体框架中使用数据库优先方法来使用存储库模式。我在浏览互联网上可用的资源时得到了一些想法,但对于实时应用程序,我不确定如何在从数据库优先方法自动生成的类上实现存储库模式。

我已经浏览过 SO 中的一些链接,但我没有得到任何明确的想法。我对这个很陌生。 提前致谢。


代码生成工具只会修改映射到 XML 文件的类。您有几个选择:

1) 您可以使用分部类来扩展映射的类。使用自动化工具更新代码时,部分类不会被自动化工具修改。

2)您还可以将数据注释和实体配置处理到配置文件中,但要小心,因为在某些情况下它们可能会发生冲突。下面是一个片段:

public class YourClassConfiguration : EntityTypeConfiguration<YourClass>
{
    public YourClassConfiguration()
    {
        ToTable("YourTable");
        HasKey(e => e.Property1);
        Property(e => e.Property1).HasColumnName("MyName").HasMaxLength(30);
    }
}

我正在使用这种方法,老实说,我建议您像我一样将实现转移到代码优先方法。在我个人看来,当设计者决定创建重复的键或不正确更新 XML 文件时,维护和修复问题是一件痛苦的事情,因为这种情况不止一次发生在我身上。好消息是,您可以避免迁移和 Code First 使用的一些功能,并按原样保留数据库结构。一切都可以配置。如果您有兴趣,我可以告诉您更多信息。

不管怎样,我还附上了一个 GenericRepository 模式的简单代码片段,您可能会觉得有用。我还强烈建议在您的实现中使用依赖注入(GenericRepository 模式需要解决依赖关系)。我会推荐Autofac。它非常稳定并且有很大的支持。

    public class EntityRepository<T> : IRepository<T>, IDisposable where T
                                    : class, IEntity
    {

        private readonly DbSet<T> dbset;
        private readonly DbContext _context;
        private readonly bool _lazyLoadingEnabled = true;


        public EntityRepository(DbContext context, bool lazyLoadingEnabledEnabled)
        : this(context)
        {
            _lazyLoadingEnabled = lazyLoadingEnabledEnabled;
        }

        public EntityRepository(DbContext context)
        {
            _context = context;
            _context.Configuration.LazyLoadingEnabled = _lazyLoadingEnabled;
            dbset = context.Set<T>();
        }

        public void Add(T entity)
        {
            dbset.Add(entity);
            _context.SaveChanges();
        }

        public void Update(T entity)
        {
            var originalValues = FindOne(x => x.Id == entity.Id);
            _context.Entry(originalValues).CurrentValues.SetValues(entity);
            _context.SaveChanges();
        }

        public void Remove(T entity)
        {
            dbset.Remove(entity);
            _context.SaveChanges();
        }

        public List<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return dbset.Where(predicate).ToList();
        }

        public T FindOne(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return dbset.FirstOrDefault(predicate);
        }

        public List<T> FindAll()
        {
            return dbset.ToList();
        }
    }

界面非常简单:

    public interface IRepository<T>
                    where T : class, IEntity
    {
        void Add(T entity);
        void Update(T entity);
        void Remove(T entity);
        T FindOne(Expression<Func<T, bool>> predicate);
        List<T> Find(Expression<Func<T, bool>> predicate);
        List<T> FindAll();
    }

将接口应用到您创建的用于扩展数据库第一类的分部类,您将能够查询存储库中的这些实体。您还可以将属性添加到存储库界面,使这些属性可见,并添加使用常见属性(例如 ID、名称等)进行搜索的常见功能(如果适用)。

我希望它有帮助,
Carlos

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

如何在实体框架中使用数据库优先方法来使用存储库模式 的相关文章

  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 更改 IdentityServer4 实体框架表名称

    我正在尝试更改由 IdentityServer4 的 PersistedGrantDb 和 ConfigurationDb 创建的默认表名称 并让实体框架生成正确的 SQL 例如 而不是使用实体IdentityServer4 EntityF
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 为什么 Visual Studio 不移动发布中的某些文件?

    当我尝试发布项目时 Visual Studio 不会将某些文件移动到目标发布文件夹 目前我有这个问题 json文件 我正在使用 Visual Studio 2010 和 MVC4 是否有关于应发布哪些文件或 mime 类型并将其移动到目标文
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 我可以在不创建 DLL 的情况下使用同一项目中的 UserControl 吗?

    我制作了一个用户控件 并且已经能够通过将其添加到 C 代码中的表单来使用它 用户控件与主窗体位于同一 VS2005 项目中 问题是我无法通过此实现在 gui 编辑器 Design 窗口 中看到用户控件 我尝试了很多方法 但无法将用户控件添加
  • 如何在node.js中使用混合C++和.Net dll? (错误:已调用 abort())

    我想在 Visual Studio 2015 中使用包含 C 和 C 代码的 dll 创建本机节点扩展 我无法使其工作如下我自己的指示 https stackoverflow com q 11257690 709537去年的 这是基于最新的
  • 如何从实体框架 6 中的 Auditlog 实体获取 id

    我知道那里有几个类似的帖子 但我找不到任何解决此问题的帖子 我想在实体框架 6 中添加 更改或删除实体 软删除 时添加 某种 AudioLog 我已经覆盖了 SaveChanges 因为我只想为添加 修改或删除的 EntityStates
  • TeamCity 中代码覆盖率的属性过滤器语法

    有人知道从 Teamcity 的覆盖范围中排除代码的语法吗 我在某些方法上使用 ExcludeFromCodeCoverageAttribute 并希望排除这些方法 它在 Visual Studio 中运行良好 但我不明白如何在 TeamC
  • 检查Web服务是否存在

    有人可以告诉我确定给定 URL 是否存在 Web 服务 ASP NET 的最佳方法吗 我假设一种方法类似于使用 System Net Webclient 发出请求 但我如何确定它是否是有效的 Web 服务以及我应该发出哪种类型的请求 编辑
  • Rfc2898DeriveBytes 与密码的 Sha2 哈希生成

    我最近知道使用 SHA256 为加盐密码生成密码哈希 在阅读了一些有关加盐密码和安全性的内容后 我看到rfc2898derivebytes and passwordderivebytes NET 中的类 使用有什么好处吗rfc2898der
  • 无法将 iTextSharp 与 ASP.NET 5 Core 一起使用

    我正在尝试将 iTextSharp 与 ASP NET 5 Core 一起使用 但是 当我尝试使用 iTextSharp 5 5 5 构建 ASP NET 应用程序时 出现这些错误 Code using Microsoft AspNet M
  • MVC:业务逻辑放在哪里? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 首先 我看到了很多这方面的问题 但背后的推理还不够 如果我的问题不够好并且应该被删除 我会理解 我看过 例如 this https stacko
  • 如何使用 Serilog ForContext

    我是 Serilog 新手 很难弄清楚如何使用上下文功能 当我运行下面的代码时 输 出文件不包含报告 ID 我缺少什么想法吗 var logger new LoggerConfiguration WriteTo File C Log txt
  • WCF Rest 服务还是 ASP.NET MVC 控制器/操作?

    如果有人能提供一些关于哪种更有益的见解 我将不胜感激 WCF 中的 RESTful 服务可以提供与 ASP Net MVC 控制器相同的功能 即可以使用控制器 操作适当地形成 URL 使用其中一种比另一种有真正的好处吗 WCF休息服务将提供
  • LINQ:获取表详细信息

    我正在使用 LINQPad 我想了解表的架构详细信息 我知道我是用 SQL 来做的 SELECT column name FROM information schema columns WHERE table name table name
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • PowerShell 找不到过载

    我正在尝试使用https sshnet codeplex com https sshnet codeplex com 允许 PowerShell 脚本将文件上传到 SFTP 服务器 一切似乎都有效 除了找不到该方法的重载UploadFile
  • 在新的 ASP.NET MVC 5 项目中更新 NuGet 包引用后,如何修复与 JSON.NET 的程序集版本冲突?

    我在 VS 2013 更新 1 中创建了一个新的 ASP NET MVC 5 Web 项目 然后更新了所有 NuGet 包 当我构建项目时 我收到以下警告 警告 MSB3243 无法解决 Newtonsoft Json Version 6
  • 使用 List.Contains 方法为 LINQ 构建表达式树

    Problem 我正在重构一些LINQ查询我们的 Web 应用程序中的多个报告 并且我尝试将一些重复的查询谓词移至它们自己的中IQueryable扩展方法 以便我们可以将它们重新用于这些报告以及将来的报告 正如您可能推断的那样 我已经重构了

随机推荐

  • iOS 弹出“此应用内购买已被购买”

    我的 iOS 应用程序遇到问题 当我触摸 购买 按钮购买 IAP 产品时 会出现一个弹出窗口 显示以下消息 此应用内购买已被购买 它将免费恢复 我以前从未遇到过这种弹出窗口 而且我的产品只是不续订订阅 所以我想知道为什么在购买订阅时会出现此
  • Java方法重载+双重调度

    谁能详细解释一下重载方法的原因print Parent parent 在使用时被调用Child我的测试代码中的实例 这里涉及到 Java 中的虚拟方法或方法重载 解析的特殊性吗 有直接参考 Java Lang Spec 的吗 哪个术语描述了
  • 获取 WrappedArray 行值并将其转换为 Scala 中的字符串

    我有一个数据框 如下所示 value WrappedArray LineItem organizationId LineItem lineItemId WrappedArray OrganizationId LineItemId Segme
  • Bootstrap 3.3.2 模态事件多次触发

    引导模态事件 http getbootstrap com javascript modals events多次开火 或者更确切地说 总是比以前多开火一次 我将模态事件包装在一个单击函数中 该函数现在返回模态 id 如何确保该事件始终仅触发一
  • IDE0006 在 Visual Studio 中运行 Xamarin Android 项目时出错

    我刚刚创建了一个新的 Visual Studio for Cross Platform 项目 清理解决方案 重建解决方案 运行 Android 项目 编译花了很长时间 最后模拟器出现了 一段时间后 我收到 Warning IDE0006 错
  • 在 Eclipse 中编码

    我正在尝试使用 Eclipse 编码 UTF 8 来表示波兰语字符 不幸的是 我仍然遇到编码问题 我的设置 Window gt Preferences gt Debug Window gt Preferences gt Workspace
  • 嵌套结构的 boost 序列化不起作用

    我正在尝试序列化包含两种或多种其他类型结构的结构 但序列化好像不行 以下是示例代码 简单数据 hpp include
  • C# 中的并行和工作划分?

    假设我有 10 个核心 当我写的时候 Parallel For 0 100 i state gt Console WriteLine i 问题 每个核心分配数量的公式是什么 是吗100 10 在执行点 每个核心是否已经知道将处理哪些数字 或
  • 使用 tar.gz 下载在 Ubuntu 13.10 上安装 nltk 3.0

    我想在 Ubuntu 13 10 上安装 nltk 3 0 我已经运行 Ubuntu 几个星期了 我第一次使用 Linux 我刚刚下载了 python 3 4 0 3 3 也在 Ubuntu 上 因为它是随操作系统一起安装的 Python
  • 使用 ARC,哪个更好:分配或自动释放初始值设定项?

    使用起来是否更好 更快且更高效 alloc or autorelease初始化器 例如 NSString hello NSString name return NSString alloc initWithFormat Hello name
  • StringIndexOutOfBoundsException 字符串索引超出范围错误

    当我在输入整数后输入字符串 s 时 出现此错误 Exception in thread main java lang StringIndexOutOfBoundsException String index out of range 0 a
  • 覆盖 makefile 中的“CC”和“CXX”变量

    我有一个主 makefile 其中包含通用设置 以及一个子 makefile 其中包含项目特定设置 从我的另一个问题来看覆盖 makefile 中的变量 https stackoverflow com q 18869628 24949 我了
  • 如何在张量流中找到已识别对象的位置(ROI)

    我使用的是tensorflow android示例 它有一个用于ROI位置的占位符 参见tensorflow examples android src Classifier java 但它没有被使用 我希望能够找到分类对象的投资回报率 我查
  • Selenium 失败并显示空异常消息

    我使用 Selenium 2 7 0 和 Python 2 6 我的操作系统是 Mac OS X 10 7 当我尝试实例化 webdriver 对象时 我收到以下消息 selenium common exception WebDriverE
  • 路由错误 没有路由匹配 [PATCH]“/locations”

    我在尝试更新位置项后收到路线错误 我正在使用 before action 来设置位置 id before action set location only show edit update destroy private def set l
  • 显示具有单个 ID 的多条通知消息

    我有几个同时发生的事件 我需要以串行方式向用户显示多条通知消息 理想的情况是 每条通知消息将轮流显示 持续时间约为 2 秒 我能得到的最接近的是使用多个 id 但是 使用多个 id 会产生我不想要的副作用 最终状态栏上会同时显示多条通知消息
  • 如何在退出时杀死所有子进程?

    当node js进程退出时 如何杀死所有子进程 使用child process spawn生成 我认为唯一的方法是保留对ChildProcess返回的对象spawn 并在退出 master 进程时杀死它 一个小例子 var spawn re
  • 如何动态选择要在 Jenkins 构建中使用的 git 分支

    我正在尝试为 Jenkins 构建服务器创建一个新的项目配置 为了简化我想要做的事情 我将仅使用两个组件来描述问题 组分A 该组件的更改会触发该项目在 CI 服务器上的构建 CI 服务器具有静态配置的分支来监视更改和构建 例如 掌握或开发分
  • x86 中不同数学函数的性能?

    我正在编写 3D 碰撞 想知道基本数学函数 如 sqrt pwr 三角函数 如 sin cos tan arcsin 的性能差异 我听说这取决于许多其他因素 所以我只是想粗略地了解哪一个速度较慢并且需要避免 同时寻找不同的方法来解决问题 我
  • 如何在实体框架中使用数据库优先方法来使用存储库模式

    如何在实体框架中使用数据库优先方法来使用存储库模式 我在浏览互联网上可用的资源时得到了一些想法 但对于实时应用程序 我不确定如何在从数据库优先方法自动生成的类上实现存储库模式 我已经浏览过 SO 中的一些链接 但我没有得到任何明确的想法 我