2

问题

我最近遇到了一个问题,我有一组非常标准的模型类来描述我的业务逻辑,我正在使用 fluent 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 和 Entity Framework 代码,结果发现问题出在字段NVARCHAR(MAX)映射中。string不知何故,实体框架将术语MAX视为一个整数常量,导致FormatException在解析过程中。

猜测

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

我认为可能我错过了一些配置点或滥用了流畅的 api。

问题

有没有办法让实体框架正确处理默认NVARCHAR(MAX)声明并使其停止解析MAX为整数...

在这里,我已经上传了项目本身,以防您想亲眼看到问题......

4

2 回答 2

0

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

于 2013-10-23T18:02:02.967 回答
0

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Company>().Property(x => x.Description).IsMaxLength();
    ...
}
于 2013-06-01T20:22:52.930 回答