C# 实体框架代码优先:使用';更新数据库';解析时产生XML错误
我们的项目使用EntityFramework6.0和.NET4.5,胖客户端采用代码优先的方法 我们在Visual Studio软件包管理器控制台中通过cmdletC# 实体框架代码优先:使用';更新数据库';解析时产生XML错误,c#,entity-framework,ef-code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Entity Framework Migrations,我们的项目使用EntityFramework6.0和.NET4.5,胖客户端采用代码优先的方法 我们在Visual Studio软件包管理器控制台中通过cmdlet添加迁移自动生成了大约20个迁移文件(C#分部类),并通过更新数据库成功应用了这些文件 现在,我们的客户机有一个集成数据库,它已经应用了大约10次迁移,我们现在需要应用剩余的10次迁移。我们使用updatedatabase-Script-SourceMigration:为剩余的迁移生成一个SQL脚本。在这种情况下,以及使用Source
添加迁移
自动生成了大约20个迁移文件(C#分部类),并通过更新数据库
成功应用了这些文件
现在,我们的客户机有一个集成数据库,它已经应用了大约10次迁移,我们现在需要应用剩余的10次迁移。我们使用updatedatabase-Script-SourceMigration:
为剩余的迁移生成一个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)
[…]
应用显式迁移:201609141617112_hostaufbaudidentifier。
应用显式迁移:201609141622583_RemPerStaWe。
System.Xml.XmlException:“SoftwareAuftrag_Auftrag”是意外标记。需要空白。第1943行,位置92。
位于System.Xml.XmlTextReaderImpl.Throw(异常e)
在System.Xml.XmlTextReaderImpl.Throw(String res,String arg)
在System.Xml.XmlTextReaderImpl.ThroweExpectingWhitespace(Int32 pos)中
位于System.Xml.XmlTextReaderImpl.ParseAttributes()处
位于System.Xml.XmlTextReaderImpl.ParseElement()处
位于System.Xml.XmlTextReaderImpl.ParseElementContent()处
位于System.Xml.XmlTextReaderImpl.Read()处
位于System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
位于System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r,LoadOptions o)
位于System.Xml.Linq.XDocument.Load(XmlReader阅读器,LoadOptions)
位于System.Xml.Linq.XDocument.Load(Stream-Stream,LoadOptions)
在System.Data.Entity.Migrations.Edm.ModelCompressor.Decompresse(字节[]字节)处
位于System.Data.Entity.Migrations.Dmbmigration.GetModel(Func`2 modelAccessor)
位于System.Data.Entity.Migrations.DbMigration.GetTargetModel()处
位于System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration,DbMigration lastMigration)
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration,DbMigration lastMigration)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.ApplyMigration(DbMigration migration,DbMigration lastMigration)
位于System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations,String targetMigrationId,String lastMigrationId)
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.Upgrade(IEnumerable`1 pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
位于System.Data.Entity.Migrations.Infrastructure.MigratorScriptingDecorator.ScriptUpdate(字符串sourceMigration,字符串targetMigration)
位于System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdateRunner.Run()处
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
位于System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner)
位于System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdate(String sourceMigration、String targetMigration、Boolean force)
在System.Data.Entity.Migrations.UpdateDatabaseCommand.c__DisplayClass2.b__0()中
位于System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作命令)
在引起问题的文件中,这里是201609141622583_RemPerStaWe
,对于任何名称为SoftwareAuftrag
或类似名称的文件,绝对不做任何处理。这是在以前的迁移中完成的,在那里,我也看不到任何问题
我尝试通过代码附加调试器,但我不知道在哪里设置断点。在这种情况下,“发生异常时中断”选项似乎不会触发中断。可能从包管理器启动另一个子流程
我不知道如何解决这个问题,我们在这个问题上浪费了很多时间。希望有人对此有所暗示
更新
我系统地删除了单个迁移文件,直到我发现有3个文件组合导致了错误。但是当我取消注释
up
和down
中的所有内容时,错误仍然存在。删除全部3个迁移文件时,错误消失。这有什么意义?资源文件有问题吗?我不知道…我通常使用如下命令:
Update-Database -Script
-SourceMigration:"201502201618119_Migrations17"
-TargetMigration:"201503031134340_Migrations18"
然后在服务器上运行生成的脚本SourceMigration
是服务器上\uu MigrationHistory
表中的最后一项
对于迁移问题,我使用的另一个“技巧”是删除尚未应用于服务器的迁移脚本,然后再次运行addmigration
。这可能是由于两次迁移之间存在冲突造成的。这样做,而不是调整单个脚本
更新:
上面的时间戳不是必需的。例如:
SourceMigration:“Migrations17”
是所需的全部。如果我认为正确,我从您的帖子中了解到:您已通过项目管理控制台或命令工具将迁移应用到数据库,而无需再次自动迁移
若我并没有弄错的话,在发布或用完时,在最后一步取消它
1-打开文件
<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>
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核心Web Api发布到azure时遇到的情况。问题是,由于提到的XML错误,没有生成脚本。我不知道这到底是什么XML。