2013-06-01 2 views
2

Проблема

Я столкнулся с проблемой в последнее время, у меня есть довольно стандартный набор классов моделей, описывающих мой бизнес-логику, я использую свободно Апи для описания свойств базы данных моих классов моделей. Но после того, как я делаю Add-Migration InitialMigration Пакет Консоль управления выдает следующий вывод:Entity Framework терпит неудачу с FormatException, вероятно, ошибка

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. Так или иначе Entity Framework обрабатывал термин MAX как целочисленную константу, вызывающую FormatException во время процесса синтаксического анализа.

Догадка

Я думаю, что проблема заключается в конфигурации проекта или смеси Fluent Апите с 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...

ответ

1

Вы должны использовать MaxLengthparameterless constructor для аннотирования строки с максимальной длиной. На Sql Server это будет переведено на NVARCHAR(MAX).

Вы также можете использовать свободно IsMaxLength метод, как:

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

Это не работает, даже если я задал все строковые поля целым значениям, проблема сохраняется с какой-то странной таблицей «История», которая содержит поле «nvarchar (max)», к которому у меня нет доступа, это, вероятно, внутренняя таблица Entity Framework, которая используется под обложками ... – Lu4

+0

Не можете ли вы воссоздать базу данных? Или вам нужно отменить последнюю миграцию и снова мигрировать? –

+0

Да, в этом проблема, я не могу ее воссоздать, исключение FormatException ... – Lu4

0

Не используйте IsMaxLength() и HasColumnType ("NVARCHAR"), в то же время. Удалите последний, и он должен работать.