2012-04-26 49 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相关的任何复杂类型来解决此问题。