【问题标题】:Entity Framework Code-First: Generate SQL script with 'Update-Database' produces XML error while parsing实体框架代码优先:使用“更新数据库”生成 SQL 脚本在解析时产生 XML 错误
【发布时间】:2016-09-28 08:56:16
【问题描述】:

我们的项目使用 Entity Framework 6.0 和 .NET 4.5,FAT-Client 和 Code-First 方法。

我们有大约 20 个迁移文件(C# 部分类)通过 Visual Studio 包管理器控制台中的 cmdlet Add-Migration 自动生成,并通过 Update-Database 成功应用。

现在,我们的客户有一个集成数据库,已经应用了大约 10 个迁移,我们现在需要应用剩余的 10 个迁移。我们使用Update-Database -Script -SourceMigration:<migration10> 为剩余的迁移生成SQL 脚本。在这种情况下——以及在使用SourceMigration:$InitialDatabase 时——会显示以下错误:

[...]
Applying explicit migration: 201609141617112_HostAufbauIdentifier.
Applying explicit migration: 201609141622583_RemPerStaWe.
System.Xml.XmlException: 'SoftwareAuftrag_Auftrag' is an unexpected token. Expecting white space. Line 1943, position 92.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
   at System.Xml.XmlTextReaderImpl.ThrowExpectingWhitespace(Int32 pos)
   at System.Xml.XmlTextReaderImpl.ParseAttributes()
   at System.Xml.XmlTextReaderImpl.ParseElement()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
   at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o)
   at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
   at System.Xml.Linq.XDocument.Load(Stream stream, LoadOptions options)
   at System.Data.Entity.Migrations.Edm.ModelCompressor.Decompress(Byte[] bytes)
   at System.Data.Entity.Migrations.DbMigration.GetModel(Func`2 modelAccessor)
   at System.Data.Entity.Migrations.DbMigration.GetTargetModel()
   at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorScriptingDecorator.ScriptUpdate(String sourceMigration, String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdate(String sourceMigration, String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)

在引起问题的文件中,这里是201609141622583_RemPerStaWe,绝对不会对名称为SoftwareAuftrag 或类似名称的任何内容进行任何处理。这些东西是在以前的迁移中完成的,在那里,我也完全没有看到任何问题。

我尝试通过代码附加调试器,但我不知道在哪里设置断点。在这种情况下,“发生异常时中断”的选项似乎不会触发中断。也许另一个子进程是从包管理器启动的。

我不知道如何解决这个问题,我们为此浪费了大量时间。希望有人对此有所暗示。 ;)

更新

我系统地删除了单个迁移文件,直到我发现恰好 3 个组合在一起导致错误。但是,当我取消注释 updown 中的所有内容时,错误仍然存​​在。删除全部 3 个迁移文件时,错误消失了。这有什么意义?资源文件有问题?我不知道...

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-migrations


    【解决方案1】:

    我通常使用如下命令:

    Update-Database -Script 
           -SourceMigration:"201502201618119_Migrations17"   
           -TargetMigration:"201503031134340_Migrations18"
    

    然后在服务器上运行生成的脚本。 SourceMigration 是服务器上 __MigrationHistory 表中的最后一个条目。

    我对迁移问题使用的另一个“技巧”是删除尚未应用于服务器的迁移脚本,然后再次运行Add-migration。导致这种情况的两个迁移之间可能存在冲突。这样做而不是调整单个脚本。

    更新: 上面的时间戳不是必需的。例如: 只需SourceMigration:"Migrations17" 即可。

    【讨论】:

    • 问题是由于提到的 XML 错误,没有生成任何脚本。无论如何,我不知道这是什么 XML。我发现对于每次迁移,都会存在一个 .RESX 文件来存储模型的一些哈希值。也许这会引起麻烦?
    • 谢谢!我们的情况是有两个数据库实例,DEV 和 INT。前者已经应用了所有迁移(在应用它们时没有出现错误),而后者处于迁移 #10。所以删除单个脚本可能对 INT 有效,但意味着我们必须弄乱 DEV 的“__MigrationHistory”表。我们可能不得不这样做,但如果我们真正了解上述错误的原因会更加平静,对于未来这样的情况也是如此。
    【解决方案2】:

    如果我认为正确,我从您的帖子中理解:您已通过 项目管理控制台或命令工具 将迁移应用到数据库,而不需要再次自动迁移它。

    如果我没记错的话,请在发布或用完时在最后一步取消它

    1- 打开文件

    Microsoft.NET.Sdk.Publish.TransformFiles.targets

    2-删除相关节点

    <GenerateEFSQLScripts
      Condition="'$(_IsAspNetCoreProject)' == 'true' And 
    
    '$(IsGenerateEFSQLScriptsDisabled)' != 'true' And @(EfMigrations) != ''"
          ProjectDirectory="$(MSBuildProjectDirectory)"
          EFPublishDirectory="$(_EFPublishDirectory)"
          EFSQLScriptsFolderName="$(EFSQLScriptsFolderName)"
          EFMigrations="@(EFMigrations)"
          EFMigrationsAdditionalArgs="$(EFMigrationsAdditionalArgs)">
          <Output TaskParameter="EFSQLScripts" ItemName="_EFSQLScripts" />
        </GenerateEFSQLScripts>
    

    这是我在 发布 Asp.Net core Web Api 项目到 azure 时遇到的情况

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2014-09-04
      • 1970-01-01
      相关资源
      最近更新 更多