【问题标题】:Avoid entity duplication with Linq in ASP.NET Core Web API在 ASP.NET Core Web API 中使用 Linq 避免实体重复
【发布时间】:2022-01-04 01:04:53
【问题描述】:

我想知道在 ASP.NET Core Web API 项目中避免实体重复的最佳方法。

假设您有一个带有名称和制造商的产品,并且您想确保名称是否重复。想象一下,一个带有名字的新产品来自客户端(dto),我们需要查看这个名字(实体)是否已经存在于数据库中(使用 EF)。

  1. 您需要修剪实体名称和 dto 名称的名称 (name.trim())

  2. 您需要删除中间的所有空格 (string.replace(" ", string.empty())

  3. 您需要将所有内容更改为小写 (string.lower())

  4. 最后你需要比较这两个

是否有任何最佳实践可以在不编写所有代码的情况下做到这一点?我尝试将string.comparecompareoptions 一起使用,如ignorecaseignoresymbols 以及string.equal()ignorecase 选项,但EF 给我一个警报,它无法翻译代码。

br

【问题讨论】:

  • 基本上,您的比较方案没有内置方法。您需要为您的需求编写业务逻辑,例如为字符串编写扩展方法。
  • @TinyWang:编写扩展方法是一个很好的方案,但我总是收到来自 EF 的错误,说它无法翻译。
  • 分享你的代码 sn-p 和错误信息?

标签: entity-framework linq asp.net-core-webapi


【解决方案1】:

我对你的方法有一个建议。

  1. 在向该表中插入新记录时,引入另一列(这可以是主键和其他键)并使用修剪和小写保存名称。

示例: 原名:Amir Masoud Babaei --> 新列值:amirmasoudbabaei

  1. 当您插入新记录时,请进行修剪和小写更改并将其保存到数据库中。既然是主键,应该会报错。

  2. 因此,使用这种方法,您无需遍历所有名称并验证该名称是否已存在。

【讨论】:

  • 感谢 Avi,这个场景真的很酷,但我们确实有很多其他的业务逻辑也值得关注。像序列号也需要唯一或其他逻辑。所以,我认为我为每个业务逻辑写一个专栏不是一个好主意,对吧?
  • 绝对正确,我们不需要为您要执行的每个验证创建单独的列。因此,在这种情况下,您可以定义一个名为 IValidation 的接口,它只有一个名为 Validate() 的方法。因此,您可以在您的具体类中实现这一点,并为您想要的每个属性执行验证。这样更干净漂亮。
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多