0

LINQ を使用して特定のエンティティを除外するなどのために、クラス ライブラリで静的ヘルパー クラスを使用しています。ObjectContext と、フィルター処理するパラメーターを渡します。問題は、ObjectContext が破損することです。

例えば:

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

ユーザー リストは適切に入力されますが、ObjectContext.SaveChanges()変更が行われていない場合でも、プログラムは でクラッシュします。変更が行われた場合でも、変更をまったく保存できません。

「Null 参照例外」や DateTime オーバーフローなどを取得しています。空のオブジェクトが ObjectContext で終了しているように見えるため、保存しようとすると、データベース内のあらゆる種類の制約に違反します。理由はわかりませんが、ヘルパー クラス内で行っていることは、LINQ を使用して ObjectContext 内のリストをフィルター処理し、結果を返すことだけです。

アプローチが明らかに間違っている/悪い場合、または適切な代替手段がある場合、何がこの破損につながる可能性があるか知っていますか? 新しいコンテキストのあとがきを作成することは機能しますが、ハックのように感じます。

例 (別のクラス ライブラリ、静的クラスに格納):

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

2 に答える 2

0

問題は、テストユーザーを作成し、テストユーザーの複雑なプロパティの1つがObjectContextからフェッチされたため、このテストユーザーが間接的にObjectContextにも属していることでした(少し奇妙です)。保存すると、このテストユーザーも保存しようとしました。とにかく、このテストでObjectContextに関連する複合型を設定しないように注意してください-usersプロパティはそれを解決しました。

于 2012-04-27T17:45:58.390 に答える
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 で問題なく動作するはずです (ただし、上記はもう少しクリーンで流暢です)。問題は、コンテキストのスコープが正しくないことだと思います。コンテキストを取得/破棄する場所にも少し投稿できますか?

于 2012-04-26T23:15:45.280 に答える