2017-06-13 52 views
0

エラーが、私はこのエラーを解決/トラブルシューティングするかどうかはわかりませんSystem.InvalidCastExceptionの:型に型「可能System.String」のオブジェクトをキャストすることができませんが「可能System.Int32」

System.InvalidCastException occurred HResult=0x80004002 Message=Unable to 
    cast object of type 'System.String' to type 'System.Int32'. Source=<Cannot 
    evaluate the exception source> StackTrace: at 
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.SimpleNullableDependentKeyValueFactory 1. TryCreateFromBuffer(ValueBuffer valueBuffer, TKey& key) at 
Microsoft.EntityFrameworkCore.Query.Internal.WeakReferenceIdentityMap`1.CreateIncludeKeyComparer(INavigation navigation, ValueBuffer valueBuffer) 

です。すべての例外設定をチェックインしてもエラーが解消されるわけではありません。また、(私のコードではないと思われるため)何らかの洞察を提供するものでもありません。

EntityFrameworkCore.SQLServer 1.0.4を使用しています。現時点では新しいバージョンにアップグレードすることはできませんが、1.1.1を使用すると正常に動作します。複雑なのIQueryableにToListメソッドを呼び出す際

のSQL Server 2016 VS 2017

を使用して問題が発生します。

エラーはどのように解決されますか?どのように進むべきかに関する推奨事項?

+0

コードを見ている間に手掛かりがない場合、どうすればいいですか?また、アップグレードによって問題が解決された場合は、古い(実質的にはベータ版)バージョンでその問題を回避しようとするのは意味がありません。 –

+0

StackTraceを見た後、値を具体化している間に関係のフィックスアップでエラーが発生したように見えます。これは、障害のあるモデル、不整合なデータベース状態、または何か他のものを指している可能性があります。コードと値を見ることなく、解決策を提示することは不可能です。 – DevilSuichiro

答えて

0

どうやら、どこかにあなたがint型に文字列をキャストしてみてください。問題は、あなたがどこを知らないかということです。

あなたはエンティティフレームワークで標識し、この質問を投稿しているので、私はこの問題は、そのレルムであると仮定します。

問題の診断方法は?

どこか、あなたのテーブルを記述するDBSetプロパティでDbContextから派生したクラスがあります。

class MyDbContext : DbContext 
{ 
    public DbSet<MyItem> MyItems {get; set;} 
    public DbSet<YourItem> YourItems {get; set;} 
} 

とどこかで、あなたの例外を発生させ、あなたの困難なLINQクエリを持っている:

SomeDifficultLinqQueryがある
using (var myDbContext = new DbContext()) 
{ 
    var result = myDbContext.MyItems.SomeDififultLingQuery(); 
} 

WhereSelectGroupByとの他の拡張機能の多くの連結と `IQueryable。

問題がある場合、診断あなたのDifficultLinqQueryは小さなステップに分割し、あなたのデバッガでそれぞれの結果を確認するには:

IQueryable<MyItem> result1 = myDbContext.MyItems; 
var result1List = result1.ToList(); 

IQueryable<MyItem> result2 = result2.Where(item => item.name = "Trump"); 
var result2List = result2.ToList(); 

var result3 = result2.GroupBy(item => item.Address) 
var result3List = result3.ToList(); 

var result4 = result3.Select(item => new 
{ 
    President = item.Name, 
    Tweet = ... 
}; 
var result4List = result4.ToList(); 

今デバッガでは、最初の段階で停止し、すべてのステップを確認した後、結果。あなたがintに変換しようとしている文字列がどこかにあります。これができない場合は、デバッガから通知されます。 INT32使用Int32.Parseに文字列を変換するには

。あなたの恋人とSQLのプロバイダがこれをサポートしていない場合は、できるだけ文字列を文字列にしておく必要があります。ただ、使用を変換する前AsEnumerable()

VAR resultX = ... //このステップは VARの作品最後のものであるresultY = resultX.AsEnumerable() .Select(項目=>新しい { intValue =でInt32.Parse (item.StringValue)、 ... }

0

はあなたの非常に詳細かつ洞察力の応答をありがとうございました。これらの技術を使用して、問題が特定され、私はまだ理由はわからないが、解決することができました。

私たちの設計では、EFコア1.0.4の階層あたりのテーブルを使用して、LegalEntityクラスを用意しています。ビジネスと参加者はLegalEntityから継承します。エンティティには多くの従業員が参加できます(参加者)。参加者は多くの雇用者(法的権限)を持つことができます。

modelBuilder.Entity() .HasMany(Z => z.Employees)を.WithOne(): - コンテクストクラスの "OnModelCreating" 方法で - 流暢文が追加された問題を解決するために

。 HasForeignKey(z => z.EmployerID);

modelBuilder.Entity() .HasMany(z => z.Employers).WithOne()。HasForeignKey(z => z.EmployeeID);だから、

、流暢な文、プラスLegalEntityで定義されたコレクション...

公共ICollectionを従業員{取得します。セット; }

...プラス参加者に定義されているコレクション:

公共ICollectionを雇用{取得します。セット; }

...結果として、4つの外部キーが作成されます。

問題は解決されました。方法/理由を聞かないでください。

型のオブジェクトをキャストすることができませんが、「可能System.Boolean」「可能System.Int32」をタイプする:

はまた、次のエラーを解決しました。

関連する問題