2012-01-03 5 views
2

Linq-To-Sqlクラスでマップされたデータベースがあります。私はいくつかの基本的なクエリを実行しようとすると、子テーブルにアクセスしようとするとInvalidCastExceptionで失敗します。Linq-to-SQL子テーブルを取得するとInvalidCastExceptionがスローされます

var query = (from p in PBZGdb.Instance.AuthenticationDatas 
        where p.Username == "Misha" && p.Password == "123" 
        select new { p.UserAccount }).AsEnumerable(); 

UserAccount UA = query.ElementAt(0).UserAccount; //this works! 
int count = UA.Characters.Count(); //throws InvalidCastException here 

var query = (from p in PBZGdb.Instance.AuthenticationDatas 
        where p.Username == "Misha" && p.Password == "123" 
        select new 
        { 
         p.UserAccount, 
         p.UserAccount.Characters 
        }) .AsEnumerable(); 

UserAccount UA = query.ElementAt(0).UserAccount; //throws InvalidCastException here 

私だけ例外が数秒後にアプリケーションを一時停止した後、それはデータを「取得」と何の問題も進行しない継続しよう。誰かが前にこのような何かを遭遇しましたか?どうすれば解決できますか?

P.S. CharactersテーブルはUserAccountsに外部キーでリンクされています。 UserAccountは複数の文字を持つことができます。

+0

どのプロバイダを使用しますか? *実際の* SQLクエリが出力に表示されますか? – Tigran

+1

ここに十分な情報があるかどうかはわかりません。個々の 'Character'レコード、つまり' var char = db.Characters.First() 'にアクセスできますか?私はそれが単に列が誤って構成されているのか疑問に思っています(長い対int、またはdodgy列挙値など) –

+1

: 'p.Password'警告音....実際に塩漬けされたハッシュでなければなりません、本当に –

答えて

0

私はそれを考えたと思う!それは本当に奇妙で、私はなぜ/何が起こっているのか分からないが、私は自分の誤りを特定し、今修正することができる。

マッピングの.dbmlファイルをsqlmetalで生成しました。次にプロジェクトに追加したら、名前を変更しました。しかし、私はそれを一貫性のない名前に変更したと思います(デザイナーではmyMetaとして表示され、CSファイルにはmyDBという名前が付けられていて、どこにでもmyDB名を使用していました)。そして、すべての問題が起き始める時です。私が元の名前に戻すとすぐに、すべて問題なく動作しました!

0

これを試すとどうなりますか?

var query = (from p in PBZGdb.Instance.AuthenticationDatas 
       where p.Username == "Misha" && p.Password == "123" 
       select new { p.UserAccount }).AsEnumerable(); 

UserAccount UA = query.ElementAt(0).UserAccount; //this works! 
var count = UA.Characters.Count(); //throws InvalidCastException here 

(intの代わりにノートVAR)

+0

同じ例外。さらに興味深いのは、UA.Characters(またはウォッチ式を追加する)にマウスを置くとInvalidCastExceptionが返されますが、VSで数回押すと正しい値(2)が取得され、正常に処理されます。 –

+0

<クラッチ・ストロー>データ・コンテキスト/モデルは最新のものですか?おそらく、データベースから戻ってくるものは、あまり関係しません...もう一度DBからすべてをドラッグしてみてください。 plenderj

0

あなたの列のデータ型を確認してください。多くの場合、列の値をプロパティ値に割り当てるときにこのエラーが発生します。

次のマッピングの整合性を保つようにしてください。

 
SQL   .NET 

bit  -> bool 
tinyint -> byte 
smallint -> short 
int  -> int 
bigint -> long 
decimal -> decimal 
money  -> decimal 
float  -> double (preferred) | float 

あり、同じエラーがスローされます、他の矛盾のマッピングがありますが、私の経験では、これらは最も一般的な例です。

問題は、LINQ-SQLがプロパティ値を読み込むと値を変換せずに割り当てただけなので、の値をintプロパティに割り当てようとしたときと同じエラーが発生するということです。

ヌル値の可能性もチェックしてください。これらのプロパティは、クラスでnullableである必要があります。 Nullable<int> | int?

関連する問題