0

Entity Frameworkの使用を開始したところ、必要なすべてのデータを取得するために使用できるContextクラスが作成されました。しかし、デモを見て、コードをどのように整理するかという問題に直面しています。その人はフレームワークを使用し、コンソールアプリケーションですべてをコーディングします。Entity Frameworkを使用する最良の方法は何ですか?それはきれいに見えますか?これが意味するのは...現在aspxページを使用しているので、aspx.csを使用してデータを取得または保存できます。しかし、私はこれを望んでいません。EntityFrameworkはオブジェクトなどを作成することでほとんどすべてを実行しましたが、もっと整理したいのですが、それでも、次のようなものを使用する必要があります。

using(var myobject = new MyContextData())
{
    blah blah..
}

これらの呼び出しをラップするクラスを作成する方がよいと思いますか?エンティティフレームワークを使用するより優れたプログラマーになるので、入力をいただければ幸いです。

よろしく

4

3 に答える 3

1

この質問は、EF に関するチュートリアルを提供しているすべての人が尋ねる必要があります。何が最善の方法かを言うのは難しいですが、すべてのコードを分離コード クラス (aspx.cs) に入れることは、拡張性とテスト容易性に役立ちません。この記事を読んでみてください:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net- mvc-アプリケーション

asp.net の公式チュートリアルであるだけでなく、フレームワーク EF が現在のファンシーで正しく使用できることを示しています。Repository pattern

于 2012-11-25T07:32:34.073 に答える
0

EF を処理するクラスを作成するための正しい軌道に乗っています。

このようにすることの最大の利点は、単体テストを簡単に行えることです。

早期にテストし、頻繁にテストすることは、常に良い考えです。

EF 関連のクラスを別のプロジェクトに配置することをお勧めします。

于 2012-11-25T07:31:57.893 に答える
0

編集:

Generic Repository はアンチ パターンだと思います。しかし、@TomTom のコメントがわかりません。

元の回答:

Radim Köhler が述べたように、実装する必要がありますがRepository and Unit of Work patterns 、私の意見では、彼が提供した記事は完全には正しくありません。

私の現在の仕事では、これらのパターンの次の実装を使用しています。たとえば、次の 3 種類のエンティティがありますPerson, Good and Order。Persons のリポジトリを作成しました。一般的に、リポジトリは汎用であってはなりません。このエンティティの特定のクエリを表すメソッドが含まれている必要があります。したがって、リポジトリのインターフェイスを見ると、エンティティ (Person など) に対して実行されたクエリの種類がわかります。ご覧のとおり、Person という名前の DTO を作成しましたPersonWrap。Person から PersonWrap を作成し、PersonWrap から Person を更新するには、PersonWrap()コンストラクターとUpdate()メソッドの代わりに AutoMapper を使用できます。EntityFrameworkDbContextが実装しているためUnit of Workパターンでは、作成した DbContext をリポジトリ メソッドに提供するだけで済みます。リポジトリ メソッドが別のアクションであり、このメソッドの外部で DbContext が必要ない場合は、このメソッド内で作成して破棄できます。

public class Person {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string SecondName { get; set; }
    public DateTime RegistrationDate { get; set; }
    public List<Order> Orders { get; set; } 
}

public class Good {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class Order {
    public int Id { get; set; }
    public Person Person { get; set; }
    public Good Good { get; set; }
    public int Count { get; set; }
}

public class MyDbContext: DbContext
{
    public IDbSet<Person> Persons { get { return Set<Person>(); }}
    public IDbSet<Good> Goods { get { return Set<Good>(); }}
    public IDbSet<Order> Orders { get { return Set<Order>(); }} 
}

public class PersonRepository {
    public IEnumerable<Person> GetAll() {
        using (var context = new MyDbContext()) {
            return context.Persons.ToList();
        }
    }

    public IEnumerable<Person> GetLastWeekPersons() {
        using (var context = new MyDbContext()) {
            return context.Persons.Where(p => p.RegistrationDate > new DateTime().AddDays(-7)).ToList();
        }
    } 

    public Person GetById(int id, MyDbContext context) {
        return context.Persons.Include(p => p.Orders).FirstOrDefault(p => p.Id == id);
    }

    public Person GetById(int id) {
        using (var context = new MyDbContext()) {
            return GetById(id, context);
        }
    }
}

public class PersonWrap {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string SecondName { get; set; }
    public int OrderCount { get; set; }

    public PersonWrap(Person person) {
        Id = person.Id;
        FirstName = person.FirstName;
        SecondName = person.SecondName;
        OrderCount = person.Orders.Count;
    }

    public void Update(Person person) {
        person.FirstName = FirstName;
        person.SecondName = SecondName;
    }
}

public class PersonDetailsViewController {
    public PersonWrap Person { get; protected set; }

    public PersonDetailsViewController(int personId) {
        var person = new PersonRepository().GetById(personId);
        if (person != null) {
            Person = new PersonWrap(person);
        }
    }

    public void Save() {
        using (var context = new MyDbContext()) {
            var person = new PersonRepository().GetById(Person.Id, context);
            Person.Update(person);
            context.SaveChanges();
        }
    }
}
于 2012-11-25T11:14:17.220 に答える