Sql server 如何随时间推移将数据库部分迁移到新系统?

Sql server 如何随时间推移将数据库部分迁移到新系统?,sql-server,database,entity-framework,migration,replication,Sql Server,Database,Entity Framework,Migration,Replication,我们正在进行一个多年的项目,我们正在建设一个新的系统和一个新的数据库,以最终取代旧的系统和数据库。用户在使用新的和旧的系统,因为我们正在改变他们 我们经常遇到的问题是,一个系统中的对象依赖于另一个系统中的对象。我们一直在使用视图,但在其中一种技术(实体框架)上遇到了限制,正在考虑其他选项 我们现在看到的另一个选项是复制。我的老板对可能导致的额外维护不感兴趣。那么,还有哪些其他选项可以将依赖数据获取到需要它的数据库中呢 更新: 我们使用的技术是SQLServer2008和实体框架。两个数据库都在同

我们正在进行一个多年的项目,我们正在建设一个新的系统和一个新的数据库,以最终取代旧的系统和数据库。用户在使用新的和旧的系统,因为我们正在改变他们

我们经常遇到的问题是,一个系统中的对象依赖于另一个系统中的对象。我们一直在使用视图,但在其中一种技术(实体框架)上遇到了限制,正在考虑其他选项

我们现在看到的另一个选项是复制。我的老板对可能导致的额外维护不感兴趣。那么,还有哪些其他选项可以将依赖数据获取到需要它的数据库中呢

更新:

我们使用的技术是SQLServer2008和实体框架。两个数据库都在同一个sql server实例中,因此不需要链接服务器

实体框架面临的限制是,我们似乎无法创建基于表的实体和基于视图的实体之间的关系。据我所知,数据库中的视图和表之间不存在任何关系,因此edmx图表无法推断它。我似乎无法手动创建关系而不出错。它认为视图中的所有列都是键

如果保持这种方式,则视图中的每一列都会出现如下错误:

关联结束键属性[…]为 没有映射

如果尝试将非键列的“Entity Key”属性更改为false,则会出现以下错误:

的所有关键属性 EntitySet[…]必须映射到所有 表的键属性[…] 视图名

据我所知,这听起来像是实体框架的局限性

更新#2


我还应该提到实体框架的主要限制是它一次只支持一个数据库。因此,我们需要旧数据显示在新数据库中,以便实体框架看到它。我们只需要在新系统中读取旧系统数据

您可以使用链接服务器查询将数据保留在原来的位置,但可以从另一个数据库连接到数据

根据每个数据库中的数据需要更新的程度&如果一个数据源可以保持只读,则可以:

  • 使用数据库复制向导创建SSIS包 可以作为SQL代理任务定期运行
  • 使用快照复制
  • 创建自定义BCP输入/输出流程 将数据获取到另一个数据库
  • 使用事务复制,这 可以接近实时
  • 如果两个数据库中的数据都需要读写,则可以使用:

  • 使用 更新订阅
  • 合并复制
  • 随着列表的深入,维护解决方案所涉及的工作量也在增加。如果使用链接服务器查询最适合您想要实现的目标,那么它将最有效


    编辑:如果它们是同一台服务器,那么根据另一个用户的建议,您应该能够使用servername.databasename.schema.tablename访问该表,看起来这是一个实体框架问题,而不是数据库问题。

    我不知道EntityToSql,但我知道在LinqToSql中,您可以一次连接到多个数据库/服务器.dbml,如果在表前面加上以下前缀:

    ServerName.DatabaseName.SchemaName.TableName 
    
    MyServer.MyOldDatabase.dbo.Customers
    

    我已经能够在.dbml中单击一个表,将它复制并粘贴到备用项目的.dbml中,并以名称为前缀,设置关系,它就可以工作了。。。就像我说的,这是在LinqToSql中实现的,尽管我没有在EntityToSql中尝试过。在你完成所有复制工作之前,我会先试一试

    如果Linq to实体无法跨越DB,那么复制或模拟它的东西是唯一可行的


    出于性能目的,您可能需要合并复制或带有排队(非即时)更新的事务性复制。

    感谢您的响应。我们将尝试向旧数据库表中添加触发器,以在新数据库的新表中插入/更新/删除记录。通过这种方式,我们可以继续使用实体框架,也可以进行我们需要的任何数据转换

    一旦用户界面功能转移到新系统的特定功能,我们将从旧数据库中删除该表,并向旧数据库添加一个视图,该视图具有指向新数据库表的相同名称,以实现向后兼容性


    我意识到,在我们执行此操作之前,需要做的一件事是,我们必须搜索所有代码和sql中的@Identity并将其替换为scope_Identity(),以便触发器不会弄乱旧系统中的ID。

    这里涉及到什么技术?旧系统是什么和版本,新系统是什么和版本?请解释您当前方法的“限制”。Views+是我经常使用的,到目前为止,我能够解决任何问题,比其他方法(复制、链接服务器等)简单得多。两个数据库都是同一实例上的SQL Server 2008。我用更多的细节更新了我的问题。谢谢