C# 传输数据与';之间的潜在冲突;。ValueGeneratedOnAdd()';

C# 传输数据与';之间的潜在冲突;。ValueGeneratedOnAdd()';,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,如果这是重复的,我道歉;我找不到任何直接相关的东西 困难涉及EF核心(第3.1.8节,如有必要),但不具体或仅限于此。我先编写代码,创建了许多实体,但关键是我从一个试图替换的应用程序中获取初始数据集。我的新应用程序在每个对应实体中都有许多结构差异,但旧应用程序中的数据仍然很关键,因此我将把它传输到我的新数据库中。(旧数据库由MS SQL 2008托管;新数据库由MS SQL 2019托管(如果有必要) 大多数关键字段都是GUID,问题是在EF Core中,在将来我想使用新应用程序进行更多数据输入

如果这是重复的,我道歉;我找不到任何直接相关的东西

困难涉及EF核心(第3.1.8节,如有必要),但不具体或仅限于此。我先编写代码,创建了许多实体,但关键是我从一个试图替换的应用程序中获取初始数据集。我的新应用程序在每个对应实体中都有许多结构差异,但旧应用程序中的数据仍然很关键,因此我将把它传输到我的新数据库中。(旧数据库由MS SQL 2008托管;新数据库由MS SQL 2019托管(如果有必要)

大多数关键字段都是GUID,问题是在EF Core中,在将来我想使用新应用程序进行更多数据输入时,我还希望数据库选择GUID。在EF Core Fluent API术语中,例如:

 modelBuilder.Entity("ReplaceOldApp.Models.Address", b =>
    {
        b.Property<Guid>("AddressID")
           .ValueGeneratedOnAdd()
           .HasColumnType("uniqueidentifier");
    }

modelBuilder.Entity(“ReplaceOldApp.Models.Address”,b=>
{
b、 属性(“地址ID”)
.ValueGeneratedOnAdd()
.HasColumnType(“唯一标识符”);
}
但是,如果我通知EF Core我希望数据库创建密钥,那么它将创建表,这样当我尝试从旧数据库传输数据时(无论是使用EF还是其他方式),新数据库将忽略旧的GUID并创建一个新的、不相关的GUID。(或者至少,我认为会发生这种情况。我还没有准备好尝试。)如果发生这种情况,那么所有来自(比如)老年人实体(如上述隐含地址实体)的数据,将不再在新数据库中与其对应的实体之间关联,因为所有记录都将具有闪亮的新GUID。我将拥有所有信息,并且无法实际使用它

显然,我可以告诉EF Core通知数据库它将不会创建GUID,然后我可以读取、解压并将数据从旧数据库传输到新数据库,而不用担心数据丢失(上帝愿意).但接下来,对于任何新的数据输入,GUID都不会自动生成。我当然可以为各种实体修改我的
IEntityTypeConfiguration
Fluent API类,并进行第二次迁移,重新生成受影响的表,但我担心EF Core会决定需要
删除这些表为了适应这样的变化。(同样,我也不确定,因为我还没有尝试过:对不起。)

因此,我的问题是:您将如何处理这种情况?我是否应该忽略EF,并对MS SQL Studio进行一些巧妙的操作?我是否应该在中间进行两次迁移?我是否应该告诉数据库,即使它被告知生成密钥,以某种方式接受旧密钥,而不进行任何更改,可能是通过
LINQ

================编辑:

我相信SSIS可以将数据从旧数据库传输到新数据库,但学习过程似乎令人望而生畏,我只想解决一个问题,而不是获得新的职业生涯。Powershell同上,尽管它可能更像黑客的工具,因此对它的了解可能有助于调整或帮助解决各种一次性SQL服务器让人头疼。不过,和你一样,我更喜欢使用我所知道的,或者如果没有,我更喜欢学习或更多关于一个承诺在未来为我提供始终如一服务的工具

(对我)非常欢迎关于
IDENTITY\u INSERT
的信息,以及从中获得的信息,我认为我不应该使用LINQ to SQL,因为它可能会假设
IDENTITY\u INSERT
OFF
并简单地过滤掉关键的GUID,因此无法将其提供给目标服务器。相反,我似乎可以使用C来生成一系列的代码d个SQL语句,然后在目标服务器上的
TransactionScope()
中运行每个语句。因为每个这样的插入都将因此“在同一连接中”运行,所以整个插入事务的
IDENTITY\u insert
状态将被保留,并且(creek不会上升)它应该工作


再次感谢您的回答。它似乎引导我找到了一种在我的环境(EF核心)的潜在约束下工作的方法,同时允许我保留关键的现有身份信息。Peace.

不是EF程序员,我不知道是否有身份插入选项可供迁移使用。您可以搜索该术语以查看是否出现

<>我们的团队支持数据库迁移。我们可以通过多种方式来做。我甚至不考虑EF,因为它不是为数据迁移而设计的,或者是为数据库设计的(并且因为我们倾向于使用我们所知道的)。 我不会这样做,但如果您没有使用SSIS,它可能会比SSIS更好。如果表位于同一数据库或同一服务器上的数据库中,您可以使用T-SQL一次加载每个表。即使不在同一服务器上,链接服务器也会允许分布式事务。(我避免使用像瘟疫一样的链接服务器,但有一次我会容忍这种情况,比如迁移。我宁愿将源数据库的副本恢复到目标服务器以用作源。出现错误的分布式事务迫使我重新启动关键服务器。)

每个表可以有4个部分的名称。如果服务器部分(例如,使用链接服务器名称)不存在,则使用本地实例。如果数据库部分不存在,则使用当前数据库。这是我为“src_表”和“dst_表”假设的格式

[myserver\myinstance].[mydatabase].[myschema].[mytable]

每个表都加载了T-SQL,如下所示:

TRUNCATE TABLE dst_table
SET IDENTITY_INSERT dst_table ON  
INSERT dst_table (...) SELECT ... FROM src_table 
SET IDENTITY_INSERT dst_table OFF -- must be turned off - only 1 table can have this ON
如果存在外键,则需要首先加载某些表(例如def表)

如果该表没有标识列(EF代码创建所有值),则不使用IDENTITY\u INSERT内容。如果使用它并使用其他内容,则会失败