2011-09-11 13 views
6

誰かが私はこの例外を解決するのに役立ちます:Entity Frameworkの - 「タイプの一定の値を作成することができません...」例外

試験方法 KravmagaTests.Model.Entities.StudentTest.Create_Valid_Studentは 例外がスローされました: System.NotSupportedException:型 'Kravmaga.Models.Account'の定数 値を作成できません。このコンテキストでは、プリミティブ型( '、Int32、String、Guid'など)のみがサポートされています。

私はこの試験方法を実行したとき、私はこれを取得:

[TestMethod] 
public void Create_Valid_Student() 
{ 
    Student student = new Student() 
    { 
     Username = "username", 
     Firstname = "firstname", 
     Surname = "surname", 
     Email = "[email protected]", 
     Password = "password", 
    }; 
    KravmagaContext context = new KravmagaContext(); 
    context.AddToAccounts(student); 
    context.Save(); 
    bool exists = context.Accounts.Contains(student); // THIS THROWS EXCEPTION 
    Assert.IsTrue(exists); 
} 

おかげで多くのことを。

答えて

9
あなたの試験方法は、この方法を変更

:特定のオブジェクトのインスタンスがcontext.Accountsセット内にある場合、それはチェックしているため

// ... 
context.Save(); 
int newStudentId = student.Id; 
// because the Id generated by the DB is available after SaveChanges 

bool exists = context.Accounts.Any(a => a.Id == newStudentId); 
Assert.IsTrue(exists); 

Containsは、ここでは動作しません。このチェックのSQLへの変換はサポートされていません(例外のように)。 Anyは、指定したフィルタ式をSQLに変換してデータベースに渡します。

+0

ありがとう、これは本当に何が間違っているかを理解するのに役立ちます。 –

+0

@壱田:ところで、何をテストしていますか? 'context'は' ObjectContext'の周りに書かれたラッパーですか、それとも直接派生した 'ObjectContext'ですか?後者の場合、*自分のコードではなく、Entity Framework自体をテストしています。もし 'exists'が' false'になり、 'Assert'に達する前にEFから例外を受け取らなかった場合、EFはひどいバグを起こします。 – Slauma

+0

ありがとう! LinqとObjectsとEFで動作するものとの違いは、実際には分かりません。 – krillgar

0

Entity Frameworkはcontext.Accounts.Contains(student)をSQL文に変換しようとしています(例: "WHERE ... IN(...)")。プリミティブ型(int、string ...)を処理する方法しか知りませんので、SQL文に変換することはできません。そのため例外です。

あなたはおそらくEFのようなSQL文を生成持つようにしようとしている:同上IN(1、2、3、4、5)

あなたは、このような書き込みをすることができ口座から

SELECT *をLINQのエンティティのステートメントに次のように:詳細については

var studentIds = new int[] { 1, 2, 3, 4, 5 }; 
var matches = from account in context.Accounts 
       where studentIds.Contains(account.Id) 
       select account; 

を次のブログ記事を見てみましょう:

http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

私が言及したブログ記事は、.NET 3.5フレームワークに関する回避策を提供しています。

関連する問題