私は自分のプロジェクトのORMツールを決定しようとしていますが、EF4について考えています。
この製品の主な(もしあれば)煩わしさ/制限は何ですか?また、キャッシュをサポートしていますか?
ありがとう
私は自分のプロジェクトのORMツールを決定しようとしていますが、EF4について考えています。
この製品の主な(もしあれば)煩わしさ/制限は何ですか?また、キャッシュをサポートしていますか?
ありがとう
ここから始めるのがよいでしょう。 確かに、彼は NHibernate の主要な貢献者の 1 人であるため、特定の投稿が少し偏っているように見えるかもしれませんが、コメントにはいくつかの適切なリンクと議論があります。
そして、誰かが数か月前にSOで非常によく似た質問をしたようです。
遅延読み込みコレクションにプライベートバッキングフィールドを使用できない。 たとえば、次のクラスを取り上げます。
public class Account
{
private IList<Customer> _customers = new List<Customer>();
public IEnumerable<Customer> Customers
{
get { return _customers ; }
}
public void AddCustomer(Customer customer)
{
//Perform some biz rules
_customers.Add(customer)
}
}
顧客コレクションへのアクセスは、IEnumerableコレクションを使用し、クラスにAddCustomer/RemoveCustomerメソッドを設定することで制限されます。通常、新しい顧客を追加または削除する前に、ビジネスチェックを行います。
EFの現在のバージョンでは、遅延読み込みコレクションタイプをICollection(またはICollectionを実装する任意のタイプ)にする必要があります。したがって、上記のクラスは次のようになります。
public class Account
{
private IList<Customer> _customers = new List<Customer>();
public virtual ICollection<Customer> Customers
{
get { return _customers ; }
}
public void AddCustomer(Customer customer)
{
//Perform some biz rules
_customers.Add(customer)
}
}
パブリックICollectionを使用すると、コンシューマーがICollectionの追加操作を呼び出すことで直接アクセスできるため、顧客は優れたオブジェクト指向デザインプリンシパルを完全に破棄します。
Account acc = new Account();
acc.Customers.Add(new Customer()); //Bad code
ドメインクラスの本来の目的は、publicaddメソッドを使用することでした。
Account acc = new Account();
acc.AddCustomer(new Customer());
NHibernateは、構成を通じてこのシナリオを処理できます。このシナリオがEFでサポートされることを強く望んでいます。
ただし、バッキングフィールドを保護されていると宣言し、構成を通じてマップすることで、この制限の回避策があることに注意してください。
public class Account
{
protected virtual ICollection<Customer> _customers = new Collection<Customer>();
public IEnumerable<Customer> Customers
{
get { return _customers ; }
}
public void AddCustomer(Customer customer)
{
//Perform some biz rules
_customers.Add(customer)
}
}
ただし、保護された型は外部クラスにアクセスできないため、アプリケーションに階層化アーキテクチャがある場合(つまり、ドメインモデルがEF構成クラスから分離されている場合)は機能しません。
これを機能させるには、EFクラスがドメインモデルと同じアセンブリにある必要があります。
コレクションの読み込みを遅らせるには、ICollectionを実装するパブリックタイプまたは保護タイプが必要です。