实体框架 3.0 和帮助程序类

本文关键字:帮助程序 框架 实体 | 更新日期: 2023-09-27 18:32:19

我在类库中使用静态帮助程序类来处理使用 LINQ 过滤掉某些实体之类的东西。我传递了 ObjectContext 和我要过滤的参数。问题是ObjectContext被损坏了。

例如:

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

用户列表将被正确填充,但程序将在ObjectContext.SaveChanges()时崩溃,即使没有进行任何更改。我根本无法保存更改,即使在已进行更改的情况下也是如此。

我收到"空引用异常"和日期时间溢出等。似乎一个空对象最终出现在 ObjectContext 中,所以当我尝试保存时,它违反了数据库中的各种约束。我不知道为什么,我在帮助程序类中所做的只是使用 LINQ 过滤 ObjectContext 中的一些列表并返回结果。

你们知道什么可能导致这种腐败,如果方法完全错误/糟糕,或者是否有好的替代方案?创建一个新的上下文后记是有效的,但感觉就像一个黑客。

示例(存储在静态类中的单独类库中):

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

实体框架 3.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一起使用(尽管上述方法更干净/流畅)。我敢打赌,问题是你的上下文范围不太正确。您能否在获取/处置上下文的位置发布该位?

问题是我创建了一个测试用户,其中一个测试用户复杂属性是从 ObjectContext 中获取的,这显然导致这个测试用户也间接属于 ObjectContext(有点奇怪)。当我保存时,它也试图保存这个测试用户。无论如何,确保不在此测试用户属性中设置与 ObjectContext 相关的任何复杂类型解决了它。