背景:
有2台服务器-我们将它们命名为服务器A和B。 服务器B的数据库几乎是服务器A的镜像,我们需要在它们之间进行数据同步。数据可以来自2个服务器中任何一个的表(反之亦然)。这是我们团队出于考虑客户端的站点/工作场所而提出的设计-服务器B似乎是“虚拟”服务器,因此,即使在没有网络的情况下,部署在服务器B中的应用程序仍然可以使用。
它只是“几乎”镜像的原因是,由于其他服务器上需要“下载”数据的匹配表的ID
列的Auto Increment
选项被禁用。就SQL而言,我们只需INSERT
一条记录副本,例如从服务器A到B,包括其ID
。由于对其他表的引用/外键,我们需要保留IDs
。
当前方法:
生成内联SQL语句以在两个服务器之间同步数据。这正在工作,目前已部署。
所需方法:
想使用对象进行数据同步并完全删除内联SQL,因为我们都知道这种方法可能存在很多问题(SQL注入,使用字符串的人为/错字错误等)。
已经尝试使用EF6方法:
仅使用1个表进行测试,以使用数据库优先方法从另一台服务器同步数据。在使用ToList()
作为对象获取“新”记录的部分上,发生以下异常:
Schema specified is not valid. Errors:
The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'SampleTable'. Previously found CLR type 'Namespace.ServerA.SampleTable', newly found CLR type 'Namespace.ServerB.SampleTable'.
请注意,这只是10多个表中的1个,我还没有达到“下载”数据的目的。
示例代码:
public static List<ServerB.SampleTable> GetNewRecordsFromSampleTable()
{
List<ServerB.SampleTable> list;
using (var db = new ServerB.SampleEntities())
{
list = db.SampleTable.Where(record => record.ForSyncing).ToList();
}
return list;
}
其他信息:
两个数据库都使用MySQL。
问题:
子问题:
除了使用ToList()
以外,还有哪些其他方法可以“获取”对象,因为我们都知道这样做可能会导致性能昂贵,当有许多记录(垂直大)时/有很多表的表时字段(水平很大)?