我最近遇到了一个问题,我有很多标准的模型类来描述我的业务逻辑,我使用流畅的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...
答案 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”)。删除后者,它应该工作。