C# 从一个数据库导出实体,然后将其导入另一个数据库

C# 从一个数据库导出实体,然后将其导入另一个数据库,c#,entity-framework-core,C#,Entity Framework Core,我有一个应用程序,它基本上处理一个巨大的实体。我需要能够将其导出并导入到另一个数据库中。相同的模式/版本 我首先使用c#和ef核心代码 在涉及外键的情况下,这会变得很棘手。不幸的是,他们无处不在。我真的说不出这个问题有多复杂。是否有已知的解决方案或库?一个适合所有人的解决方案是否可行 抽象地说,我是如何思考解决这个问题的: 1. Load the full entity (all includes) 2. Export it as json, keep references 3. Impo

我有一个应用程序,它基本上处理一个巨大的实体。我需要能够将其导出并导入到另一个数据库中。相同的模式/版本

我首先使用c#和ef核心代码

在涉及外键的情况下,这会变得很棘手。不幸的是,他们无处不在。我真的说不出这个问题有多复杂。是否有已知的解决方案或库?一个适合所有人的解决方案是否可行

抽象地说,我是如何思考解决这个问题的:

 1. Load the full entity (all includes)
 2. Export it as json, keep references
 3. Import the json, create an in memory object again
 4. Traverse the entire entity graph
 5. Check if an "equal" entity already exists in the destination database
 6. If so, map the values of the already existing entity, onto the current entity
 7. call context.Update(rootEntity) 
我有两个主要问题。3.遍历实体图

我注意到了,因为我是怎么做到的。映射工作我需要从叶节点开始,一路向上。我确信我的算法还是有缺陷的,但为了测试它就足够了。但我认为这是可以解决的

更大的问题是在第4步中定义“相等”

假设我有3个这样的实体。1-1和1-N关系

class Company
   string Name
   Address Address
   List<Employee> Employees
   int AddressId

class Address
    string street

 class Employee
     string Name
     decimal Salary
     Company Company
     int CompanyId
class公司
字符串名
地址
列出雇员名单
int地址ID
班级地址
弦街
班级员工
字符串名
十进制工资
公司
国际公司
为了检查是否相等,我显然不能包含PrimaryKey Id,因为它来自不同的数据库

我想我还必须在平等性检查中忽略外键。在database1和database2中,不同的键可以指向相同的地址。但是现在,没有ID,特别是FKs,我可以得到假阳性

这些误报导致一些新公司被引进,这些新公司恰好具有相同的属性+相同的员工“窃取”现有公司的员工。FK会被覆盖

有更多奇怪的错误围绕着这个,但它很难描述。我认为错误匹配是一个无法解决的问题,因为我从等式中删除了一个实际标识符,主键


导出/导入只是一个比我想象的更大的问题吗?它保证了自己复杂的导入/导出方法,只需手动映射所有内容,并且需要在每次模型更改时进行调整?这就是我们现在所拥有的,虽然不漂亮,但它在某种程度上起作用。

你能再解释一下你的目标吗?为什么不备份数据库并用一个新名称恢复它呢?对于第4点,
导出/导入只是一个比我想象的更大的问题
是-不是更大,不同。导入/导出/ETL中不涉及实体或对象图,因此使用ORM是错误的工作工具。事实上,传输大量数据需要流式API,就像DataReader一样。这与ORM完全相反,ORM将所有内容加载到涉及数据库的内存中?如果使用SQL Server,SSM和SSI提供了非常强大的数据导出、转换和导入方法。它们也可以连接到其他数据库,因此将数据从一个数据库移动到另一个数据库可能是一个非常简单的向导驱动的过程,或者是一个复杂的ETL脚本。其他选项是将数据导出为CSV或一般平面文件,每个表一个文件,然后将其导入目标数据库。所有数据库产品都有方法以最小的日志开销快速导入平面文件。通过这种方式可以移动数百万条记录。JSON不是一个很好的选择,因为它的类型安全性并不比CSV文件高,并且需要更多的资源来解析和导入。如果您试图导入一个正确的JSON文档,例如一个对象数组,那么您必须解析并缓存整个文件,然后才能开始插入第一行。另一方面,使用CSV,数据库可以在读取行时立即导入记录,而无需缓存任何内容