实体框架代码优先迁移失败,格式异常,可能是错误

时间:2013-06-01 18:45:06

标签: .net entity-framework asp.net-mvc-4

问题

我最近遇到了一个问题,我有很多标准的模型类来描述我的业务逻辑,我使用流畅的Api来描述我的模型类的数据库属性。但是在我执行Add-Migration InitialMigration之后,程序包管理器控制台失败并显示以下输出:

PM> Add-Migration InitialMigration
Scaffolding migration 'InitialMigration'.
System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Convert.ToInt32(String value)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildColumnModel(XElement property, String entitySetName, ModelMetadata modelMetadata)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass125.<BuildCreateTableOperation>b__123(XElement p)
   at System.Data.Entity.Migrations.Extensions.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.BuildCreateTableOperation(String entitySetName, String tableName, String schema, ModelMetadata modelMetadata)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<FindAddedTables>b__31(XElement es)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, String connectionString)
   at System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges)
   at System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder)
   at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore()
   at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
Input string was not in a correct format.

起初不清楚什么字符串没有采用适当的格式,我花了几天时间制定了不同的方法,但我最终没有任何结果。作为最后一道防线,我调试了Visual Studio和实体框架代码,它们执行了所需的脚手架,结果发现问题出现在NVARCHAR(MAX)字段的string映射范围内。某种程度上,实体框架将术语MAX视为整数常量,在解析过程中导致FormatException

猜测

我认为问题在于项目配置或Fluent Api与Attribute api的混合(模型是从其他项目中复制的,这些项目使用属性来描述模型的数据库属性,迁移工作正常,一切正常,然后我删除属性并使用流畅的api来描述模型并停止工作)

我想我可能错过了一些配置点或误用了流利的api。

问题

有没有办法让Entity Framework正确处理默认的NVARCHAR(MAX)声明,并让它停止将MAX解析为整数......

Here I've uploaded the project itself in case you would want to see the problem by your own eyes...

2 个答案:

答案 0 :(得分:1)

您应该使用MaxLength属性(使用parameterless constructor来注释具有最大长度的字符串。在Sql Server中,这将转换为NVARCHAR(MAX)

您还可以使用流畅的IsMaxLength方法,如:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>().Property(x => x.Description).IsMaxLength();
    ...
}

答案 1 :(得分:0)

不要同时使用IsMaxLength()和HasColumnType(“nvarchar”)。删除后者,它应该工作。