3

私はちょうど Entity Framework を学んでおり、それを私の階層化されたコード構造に組み込むことについて、ある程度の進歩を遂げました。ビジネス レイヤーとデータ アクセス レイヤーの 2 つのビジュアル レイヤーがあります。

私の問題は、レイヤー間でエンティティ オブジェクトを渡すことです。このコード サンプルは機能しません。

// BLL
public static void Test1()
{
 List<User> users = (from u in GetActiveUsers()
      where u.ID == 1
      select u).ToList<User>();

 // Do something with users
}

// DAL
public static IQueryable<User> GetActiveUsers()
{
 using (var context = new CSEntities())
 {
  return from u in context.Users
      where u.Employee.FirstName == "Tom"
      select u;
 }
}

エラー メッセージが表示されます。 ObjectContext インスタンスが破棄されたため、接続が必要な操作には使用できなくなりました。

GetActiveUsers メソッドからusingを削除すると、正常に動作します。

GC はいつでもコンテキストを破棄し、BLL を台無しにする可能性があるため、これは危険な行為であることはわかっています。

では、レイヤー間で情報を渡す正しい方法は何ですか? コンテキストも渡す必要がありますか?

4

1 に答える 1

5

DAL からIQueryableを返すため、 usingステートメントは使用できません。

クエリは、BLL で.ToListというクエリを実行するまで延期されます。

その時までに、コンテキストは破棄されます。

すべての詳細を知らずに行うのは危険な行為であるため、IQueryable の使用については慎重に検討してください。

あなたはまだEFを学んでいるので、私はそれを単純に保ちます:

// BLL
public static void Test1()
{
 List<User> users = GetActiveUsers();
 var singleUser = users.SingleOrDefault(u => u.ID == 1);

 // Do something with users
}

// DAL
public static ICollection<User> GetActiveUsers()
{
 using (var context = new CSEntities())
 {
  var users = from u in context.Users
      where u.Employee.FirstName == "Tom"
      select u;
  return users.ToList();
 }
}

1 人のユーザーを取得する場合は、別のメソッドを作成します。

// DAL
public static User GetSingleActiveUser(int userId)
{
 using (var context = new CSEntities())
 {
  var users = from u in context.Users
      where u.Employee.UserId == userId
      select u;
  return users.SingleOrDefault();
 }
}
于 2010-11-05T01:16:40.237 に答える