0

Ok!

私は両方の技術が素晴らしいと言わなければなりません。なにかわからないようですが。

データベースにデータがあります(他のテーブルへの参照があるテーブルのデータを表示したいとします)。

List、IEnumerable、IQueryableなどのモデルがあります...

したがって、私の見解では、オブジェクトのリストを調べて、他のテーブルへの参照の優れた機能を利用したいと思います。あなたがいる間、コントローラーに問題はありません

using (var datatabse = new MyEntity)
{
}

ただし、db has disposedの使用を終了し、一般的なエラーが発生すると、ObjectContextインスタンスが破棄され、接続を必要とする操作に使用できなくなります。

したがって、エンティティオブジェクトのメモリ内コピーを作成する他のオプションは表示されません...しかし、すべてのクールなEF4参照を失い、最初にモデルにデータを手動でロードしてから、foreachを使用してビューに表示する必要があります。

したがって、List <(EF4Type)>またはIEnumerable <(EF4Type)>またはIQueryable <(EF4Type)>の代わりに

List <(MyCustomHelperClass)>を実行する必要があります。ここで、MyCustomHelperClassは、エンティティオブジェクトと同様のプロパティを持つクラスを表し、参照されるテーブルのプロパティにアクセスできないため、おそらくいくつかの追加が必要です。次に、foreachを実行し、このリストとデータをロードする必要があります。すべてを表示するRazorのビューの別の@foreach。

2倍の作業があり、プロジェクトが大きい場合は、必要なhelperClassesがどれほどマニーであるかをより大きく把握できます。このクールな新技術はすべて、本当にそのように使用されることを意図していたのでしょうか?....または何かが足りないのでしょうか。

4

3 に答える 3

3

ビューで遅延ロードされたプロパティを参照すると、おそらくそのエラーが発生します。ビューに渡す前に、コントローラーに必要なものをすべてロードする必要があります。

関連オブジェクトの読み込み(Entity Framework)を参照してください。

次の例では、すべてのコースが同じクエリの部門で取得されます。これは積極的な読み込みです。

// Load all departments and related courses
var departments1 = context.Departments                           
    .Include(d => d.Courses)                           
    .ToList();

パーツがないとInclude()、コースは後で取得される可能性があります(おそらく、コンテキストがビューに配置された後)。これは遅延読み込みと呼ばれます。

于 2012-05-17T20:49:14.183 に答える
2

jrummellが覚えているような積極的な読み込みに加えて、関連するエントリを読み込む別の方法もあります。それは明示的な読み込みです。あなたがエンティティを持っていて、それに関連するUser多くのエンティティがあるとしましょう。Groupsそれらを明示的にロードできます。

var user = context.Users.Find(id); // Load the user.

context.Entry(user)
    .Collection(u => u.Groups)
    .Load();

このように、を使用する必要はなく、 :.Include()をフィルタリングすることもできます。Groups

context.Entry(user)
    .Collection(u => u.Groups)
    .Query()
    .Where(g => g.SomeProperty.Contains("something"))
    .Load();
于 2012-05-17T21:01:29.577 に答える
1

TheMentor、

リポジトリまたはdbコンテキストのどちらを使用しているかに応じて、このオブジェクトはコントローラーアクション(要求)の期間中のみ存続する必要があるため、アクションの範囲内で必要なすべてを実行できる必要があります。

誤解しているかもしれませんが、あなたの質問に基づくと、これがあなたの問題のようです。誤解している場合でも、毎回アクション内で呼び出すのではなく、dbリポジトリまたはdbコンテキストをコントローラー全体で参照することをお勧めします。

したがって、コントローラに次のようなものが表示されるはずです。

public class TasksController : BaseController
{
    private readonly TaskService _serviceTasks;
    public TasksController(IRepository repository)
    {
        _serviceTasks = new TaskService(repository);
    }

    //
    // GET: /Tasks/

    public ActionResult Index()
    {
        var viewModel = _serviceTasks.All<Task>();
        return View(viewModel);         
    }

    public ActionResult Details(int id)
    {
        var domainModel = _serviceTasks.GetById<Task>(id);
        var viewModel = PopulateDetailsViewModel(domainModel);
        return View(viewModel);
    }

    //.. rest of actions cut
}
于 2012-05-17T20:40:57.833 に答える