通用保存方法

2024-03-21

在我的通用存储库中,我需要编写通用 Save 方法,该方法将根据 id 编辑现有实体或添加新实体。

public void Save<T>(T entity) where T : TEntity, IKeyId
{
    if (ObjectSet.Any(r => (r as IKeyId).KeyId == entity.KeyId))
    {
        Edit(entity);
    }
    else
    {
        Add(entity);
    }
}

但是当我尝试这样做时,Linq 会生成异常Any( r=> (r as IKeyId).... 不支持输入类型为“MyProg.DAL.Appeal”且检查类型为“Claimstrak.DAL.Interfaces.IKeyId”的“TypeAs”表达式。 LINQ to Entities 查询仅支持实体类型和复杂类型。

怎么写才正确呢?


好吧,事实是您不需要使用 ObjectSet,您可以使用 DbContext 以更简单的方式来完成此操作。

Bu,我想说这不是一个好的使用模式,在存储库中调用 Save() 。我建议您仅在完成所有操作后才考虑上下文的​​ .SaveSession() ,这样您可以在往返数据库之前做很多事情。

因此,您应该创建这样的方法,但不要对 UpdateOrInsert() 调用 SaveChanges() 而不是 Save() 方法,并且在完成后调用 .Save()

但我会根据您的要求给出示例(但我不建议,我建议您将 IUnitOfWork 与 IRepository 分开)

看看代码是多么简单:

    interface IKeyId
    {
        int Id { get; set; }
    }

    DbContext context = new YourContext();

    public bool Save<TEntity>(TEntity entity) where TEntity : class, IKeyId
    {
        return (entity.Id == 0) ? Add<TEntity>(entity) : Edit<TEntity>(entity);
    }

    public bool Edit<TEntity>(TEntity entity) where TEntity : class, IKeyId
    {
        var set = context.Set<TEntity>();
        set.Attach(entity);
        return true;
    }

    public bool Add<TEntity>(TEntity entity) where TEntity : class, IKeyId
    {
        var set = context.Set<TEntity>();
        set.Add(entity);
        return true;
    }

我在我的存储库中使用类似的方法,我更改了从数据库生成 POCO 类的 T4(.tt 文件),以显式实现我拥有的一些接口,例如 IAuditable、IValidatable 等,因此 T4 自动实现这些接口类中的接口。

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

通用保存方法 的相关文章

随机推荐

  • 设置 Range.Locked 时出现错误 1004

    当我试图设置Locked http msdn microsoft com en us library bb213550 28v office 12 29 aspxRange 对象的属性 代码如下所示 that goddamn sheet U
  • 如何将项目添加到列表中?

    我想添加一个字符串单词listOfVideosRated 列在我的用户表中 如果您可以发布您的架构 解析器映射模板 我可以提供更具体的建议 但我会尽力用您迄今为止发布的内容来回答这个问题 简单的方法 如果您已经拥有现有项目 则执行此操作的一
  • iOS7 UIWebView 内存泄漏

    我们有一个具有混合模式的综合 iOS 应用程序 UIWebView 在 JS 中保存了 Web 应用程序的主要部分 它在 iOS6 上运行良好 但最近我们发现所有 iOS7 设备 iPad iPhone 4 4S 和 iPhone 5 5C
  • 如何将字符串转换为 BigInteger?

    我正在尝试从标准输入中读取一些非常大的数字并将它们加在一起 但是 要添加到 BigInteger 我需要使用BigInteger valueOf long private BigInteger sum BigInteger valueOf
  • 默认显示所有文件

    有没有办法默认打开 Visual Studio 解决方案资源管理器 显示所有文件 设置 不是 Visual Studio 设置 但如果您使用版本控制 则会有所帮助 在 vcxproj 或解决方案范围的 props 文件中插入以下行
  • 我不明白为什么我的 group by 失败

    SELECT ENAME MAX SAL STORES CITY FROM EMPLOYEES INNER JOIN STORES ON EMPLOYEES STORE ID STORES STORE ID GROUP BY EMPLOYE
  • Pandas DataFrame:使用列的唯一值转换框架

    我有一个以下形式的 pandas dataframe csv date Country Type Val 2013 01 01 USA x 23 2013 01 01 USA y 13 2013 01 01 MX x 11 2013 01
  • 打开 Spyder 时出错: pylsp >=1.7.2,<1.8.0 : 1.7.1 (NOK)

    我尝试升级conda和spyder 但遇到了问题 I tried conda update anaconda conda install spyder 5 4 3 pip install pylsp mypy 我先在spyder终端中使用选
  • Android - 滚动 ListView 时微调器选择消失

    我有一个包含一堆微调器的列表视图 但是当我滚动列表视图时 微调器的值会被重置 有没有办法来解决这个问题 这就是我的 ArrayAdapter 类的样子 公共类 ProductArrayAdapter 扩展 ArrayAdapter 私有最终
  • 使用模板调用重载函数(未解决的重载函数类型编译器错误)[重复]

    这个问题在这里已经有答案了 可能的重复 如何获取重载成员函数的地址 https stackoverflow com questions 705854 how to get the address of an overloaded membe
  • Objective-C 中连接 NSString 的快捷方式

    有没有什么捷径可以到达 stringByAppendingString Objective C 中的字符串连接 或使用的快捷方式NSString一般来说 例如 我想做 NSString myString This NSString test
  • 固定 - 液体 - 固定布局

    我想要一个 固定 液体 固定 跨浏览器兼容的布局 HTML body div col 1 div col 2 div col 3 CSS col 1 width 150px float left col 2 width 100 paddin
  • 如何初始化句柄

    Error Run Time Check Failure 3 The variable TextLabelVar is being used without being initialized 示例代码 HWND VarText char
  • AngularJS:ngRoute 未提供所需的主页

    我不知道为什么我的根目录 主页 无法正确路由 显示 这是我的 ASP Net Core 项目文件目录设置 这是我的MapRoute声明于Startup cs app UseMvc config gt config MapRoute name
  • 无法更新 UITableView

    我有 UITableViewController 作为 RootViewController 我需要根据从 RootViewController 线程启动的另一个线程获取的数据向表中添加行 当我从其他线程返回到 RootViewContro
  • 如何解析MICR线数据?

    我有一台数字支票扫描仪 能够从支票中捕获 MICR 线 它将以字符串形式返回原始格式的 MICR 行 并使用分隔符分隔帐号 路由号码和支票号码 然而 每个银行对该 MICR 行的格式都不同 因此没有标准的方法来解析该数据 我尝试过的一些公司
  • Pandas 更新多索引数据框中的值

    如何编辑多索引数据框的值 如果它是一个非多索引数据框 我知道我可以这样做 df at 0 foo 12 3 另外 这不起作用 df loc 0 foo a 12 3 考虑一个多索引列数据框 colnames foo foo foo po p
  • 启动 spring web mvc 应用程序时出现异常

    当我使用 spring 3 2 9 时 我的 spring 项目工作正常 但如果我将其更改为 4 1 4 则在启动应用程序时会出现以下异常
  • 使用 C# 向 GMail 发送 IMAP 命令

    我一直在尝试访问我的 GMail 帐户以从我的电子邮件帐户中检索未读电子邮件 但是 我只执行登录 之后的任何操作都不起作用 首先 我连接到服务器 然后发送登录命令 最后发送检查命令 问题是收到的响应仅涉及连接和登录 之后 它就停止等待从 S
  • 通用保存方法

    在我的通用存储库中 我需要编写通用 Save 方法 该方法将根据 id 编辑现有实体或添加新实体 public void Save