在数据导入期间处理两个非常相似的类的最佳方法

Posted

技术标签:

【中文标题】在数据导入期间处理两个非常相似的类的最佳方法【英文标题】:Best way to handle two very similar classes during data import 【发布时间】:2020-08-21 13:59:16 【问题描述】:

背景: 我正在构建一个 C# 数据迁移工具来将数据从旧应用程序(使用 SQL Server 数据库)移动到我们的新应用程序(也使用 SQL Server 数据库),但我正在通过我们的 Web API 而不是直接插入新数据库重用业务逻辑等等。我正在使用实体框架从旧数据库中读取数据。

问题: 由于我不知道的原因,较旧的数据库系统除了使用具有最新版本记录的表之外还使用存档表。例如,可能有一个“person”表,然后还有一个“a_person”表,其中包含先前记录的多个存档副本。我计划将这些归档记录保存在同一个表中,只是在一个时间点架构中链接在一起。所以它们本质上是相同的列,但是由于 EF6,它们是两个不同的对象,这意味着当我尝试将值从“person”和“a_person”移动到将被发送到的最新数据对象时,我将所有代码加倍API。如果只是一个例子,没什么大不了的,但是大约有六张表有这种模式。

我正在想办法解决这个问题。我最初考虑为生成的 EF6 类添加接口,例如语义糖,以允许传递给通用方法,但我仍然需要将其转换回原始类,这样它不会给我带来任何好处。

接下来我想将每个表序列化为一个我可以反序列化为字典的 json 字符串 - 然后有一个通用方法可以提取我的值。但是,我觉得这可能会不必要地慢。

最近,我正在考虑更多地回到我最初的想法,使用接口,但 EF6 的部分类实现了一个通用接口和一个可以返回父 EF6 类的不同值的实现。因此,“父”和“a_parent”实体都将具有实现接口并返回父级的所有值的部分类。不过,这又是一种复制我访问值的代码的更奇特的方式。

序列化和反序列化感觉是真正消除重复代码的唯一方法。虽然迁移所花费的时间不是一个关键因素,但我宁愿不创建可能最缓慢的解决方案。我想还有反射。反射会比序列化和反序列化更受欢迎吗?

【问题讨论】:

为什么不使用 EntityFramework 获取两者,然后将它们映射到单个类? Entity 使用映射文件将数据库的表/列映射到 c# 中的类。因此,如果更新映射以匹配您最新的数据库架构,您不必移动数据。 为什么不在一个视图下统一person和a_person? 【参考方案1】:

我确定并非常满意的解决方案是基于 AlwaysLearning 的评论 - 我统一了两条记录。

【讨论】:

以上是关于在数据导入期间处理两个非常相似的类的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Rails:分离两个非常相似的视图的最佳方法是啥?

可以具有不同基成员实现的类的最佳实现

K均值聚类算法

避免传递数据框的最佳方法是啥?

【数据建模 特征分箱】特征分箱的方法

机器学习算法聚类分析-1 聚类是什么,我们如何确定类别间的相似性或者相异性