【问题标题】:How can I use SQL database with Entity Framework to convert string values locally如何在实体框架中使用 SQL 数据库在本地转换字符串值
【发布时间】:2016-03-18 23:07:45
【问题描述】:

我在一个 asp.net webforms 网站中使用 MS 实体框架。我有一张可能不经常编辑的表格,但编辑很重要。当编辑待处理(尚未批准)时,我使用“待处理”编辑表在此待处理表中存储 id、列名和值的字符串版本(可以是任何内容),然后当它被接受时我需要加载待处理的项目并将该更改应用于原始表。实体是强类型的,因此我需要一种将值从字符串动态转换为该列的“任何”类型的方法。使用纯 SQL,您可以创建一条更新语句,服务器会尝试将字符串(因为 sql 始终是字符串)转换为该列类型,但是有没有办法使用实体框架来做到这一点?

我已经四处寻找并找到了如何从字符串中获取与列名匹配的属性,但我看不到一个清晰的方法(除了硬编码一个查找表对象来尝试解析每个根据我对类型进行硬编码的类型)有更好的方法吗?

【问题讨论】:

  • 我创建了一个扩展方法,它使用Convert.ChangeType 将字符串转换为我需要的任何对象,使用Nullable.GetUnderlyingType() 并检查该类型是否为IConvertible。这适用于大多数类型,我只需要为我使用的不是IConverible 的每种类型编写一个条件。这一切都感觉很hacky,但它工作正常。

标签: sql asp.net entity-framework linq


【解决方案1】:

它可能会有点混乱,但您可以使用 tableids 和相关的更新字段类型创建一个结构/类。然后您可以使用 tableid 获取类型并使用手头的字符串值对该类型进行解析。

我可以建议的另一种方法是不使用单独的表格。复制已编辑的表行,放置一个 edit_pending 列标志和一个 original_row_id 列。稍后当编辑批准时,只需更新 original_row_id 并删除复制的行。

【讨论】:

  • 我同意你关于复制编辑行的建议方法。
  • 在这种情况下复制行是一个坏主意,因为有 50 多列,并且它们总是一次编辑一个,我还必须知道哪一列是更改为仅显示变更审批制度。我知道我可以创建一个进行所有转换的类,但应该有一个更简洁的解决方案,因为数据库驱动程序已经这样做了,我只是不知道如何访问它。
  • 您可以使用 getter 和 setter MyStringValue 创建字符串属性。在设置时,您可以使用 parse 将字符串转换为正确的类型,并设置真实属性并更新。
  • 这听起来确实是一个不错的解决方案,但我可以编辑实体框架自动生成类并锁定它们,这样如果我从数据库更新它们就不会改变它们吗?
  • 您的意思是不修改 EF 类并手动更改数据库设计?有可能的。通常,EF 中的方法是 Code First。在哪里创建模型,EF 在数据库中创建相关表。您也可以使用 Database First,您可以自己手动创建数据库和代码相关的模型对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多