2

問題

最近問題が発生しました。ビジネス ロジックを記述するかなり標準的なモデル クラスのセットがあります。流暢な 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どういうわけか、Entity Framework は termMAXを整数定数として扱っていたFormatExceptionため、解析プロセス中に が発生しました。

推測

問題は、プロジェクト構成または Fluent Api と属性 API の混合にあると思います (モデルは、属性を使用してモデルのデータベース プロパティを記述する他のプロジェクトからコピーされ、移行は機能し、すべて問題ありませんでした。その後、属性を削除し、流暢な API を使用してモデルを記述したところ、機能しなくなりました)

おそらく、構成上のポイントを見逃したか、流暢なAPIを誤用したと思います。

質問

Entity Framework がデフォルトの宣言を正しく処理し、整数としての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 に答える