2012-04-26 59 views
0

我在類庫中使用靜態幫助器類來過濾使用LINQ的某些實體。我傳遞了ObjectContext和我想要過濾的參數。問題是ObjectContext被損壞。實體框架3.0和幫助類

例如:

Users u = EntityHelper.GetUsersOfCertainAge(ObjectContext, 24); 
ObjectContext.SaveChanges(); 

的用戶列表將被適當填充,但程序會崩潰時ObjectContext.SaveChanges(),雖然已經不需要做任何改變。即使發生變更,我也無法保存所做的更改。

我得到「空引用異常」和日期時間溢出等。它似乎是一個空對象結束在ObjectContext,所以當我試圖保存時,它違反了數據庫中的各種約束。我不知道爲什麼,但是我在Helper類中做的所有事情是使用LINQ過濾ObjectContext中的某個列表並返回結果。

你們知道什麼可能導致這種腐敗,如果方法是明顯的錯誤/不好或如果有很好的選擇?後續工作創建一個新的上下文,但感覺像一個黑客。

實施例(存儲在一個單獨的類庫,在一個靜態類):

public static User GetFirstUserOfCertainAge(Entities ctx, int inputAge) 
{ 
    return ctx.Users 
     .Where(x => x.Age == inputAge) 
     .OrderByDescending(x => x.Created) 
     .FirstOrDefault(); 
} 
+0

你是什麼意思與損壞? – Xharze 2012-04-26 22:19:15

+0

對不起,我有點累。澄清它,希望它有幫助! – user1359816 2012-04-26 22:40:18

+2

你可以發佈'GetUsersOfCertainAge()'的代碼嗎? – CodingWithSpike 2012-04-26 22:43:39

回答

0

我建議使用這樣的作爲替代作爲其清潔器:

public static IQueriable<User> FilterByAge(this IQueriable<User> users, int inputAge) 
{ 
    return users 
     .Where(x => x.Age == inputAge) 
     .OrderByDescending(x => x.Created); 
} 

與使用率:

User u = ctx.Users.FilterByAge(24).FirstOrDefault(); 

就錯誤而言,您正在使用當前正在使用的方法EF可以很好地工作(雖然上面有些更乾淨/流利)。我敢打賭,問題在於你的上下文範圍並不完全正確。你可以發佈你的位置/處理上下文嗎?

+0

在Web控件/端點中,在類的頂部,我只創建上下文:private Entities ObjectContext = new Entities(); – user1359816 2012-04-27 11:53:58

+0

嘗試把它放在一個使用塊中,這樣它的正確處置,它可能不會解決你得到的實際錯誤,但它正確地使用框架 – 2012-04-27 12:01:29

0

問題是我創建了一個測試用戶,並且其中一個測試用戶複雜屬性是從ObjectContext中獲取的,顯然這導致此測試用戶間接也屬於ObjectContext(有點奇怪)。當我保存時,它也試圖保存這個測試用戶。總之,確保不要在此測試用戶屬性中設置與ObjectContext相關的任何複雜類型來解決此問題。