2011-09-11 55 views
6

有人可以幫我解決這個例外:實體框架 - 「無法創建類型的常數值...」異常

試驗方法 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); 
} 

非常感謝。

// ... 
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因爲它檢查如果一個特定的對象實例是在context.Accounts集不會在這裏工作:

回答

9

這種方式改變你的測試方法。不支持將此檢查轉換爲SQL,僅用於基本類型(例如所述)。 Any只是將您指定的過濾器表達式轉換爲SQL並將其傳遞給數據庫。

+0

謝謝,這真的可以幫助我瞭解什麼是錯的。 –

+0

@ Ikkuda:順便說一句,你在那裏測試什麼? 'context'是一個圍繞ObjectContext的自寫包裝器,還是直接派生的ObjectContext?在後一種情況下,您不是測試*您的*代碼,而是實體框架本身。如果'exists'永遠是'false',並且在到達'Assert'之前你沒有從EF得到異常,那麼EF就會有一個可怕的錯誤。 – Slauma

+0

謝謝!在Linq和Objects以及EF之間的這些小小的區別可以成爲真正的熊。 – krillgar

0

實體框架試圖將context.Accounts.Contains(student)轉換爲SQL語句(例如:「WHERE ... IN(...)」)。它不能將它翻譯成SQL語句,因爲它只知道如何處理基本類型(int,string ...),因此是例外。

你大概有EF生成的SQL語句,如:

SELECT * FROM戶口所在身份證件(1,2,3,4,5)

你可以寫這樣的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框架的解決方案。

相關問題