0

私は単にPOCOでデータモデルをモックアップしようとしています。しかし、私は何かについて少し混乱しています。この例では、ORMにEntityFrameworkを使用すると仮定します。まず、電話と住所のクラスがあります。

public class Phone
{
    int Id { get; set; }
    int Number { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street { get; set; }
    public string Suite { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public int Zip { get; set; }
}

次に、PersonクラスとCompanyクラスがあります。

public class Person
{
    int Id { get; set; }
    string FirstName { get; set; }
    string MiddleName { get; set; }
    string LastName { get; set; }
    string Prefix { get; set; }
}

public class Company
{
    int Id { get; set; }
    int Name { get; set; }
}

個人と会社の両方に電話リストまたは住所リストを持たせたいので、コードの観点からこれについて論理的に考えると、抽象クラスAContactを作成するとします。

public abstract class AContact
{
    ICollection<Phone> Phone { get; set; }
    ICollection<Address> Address { get; set; }
}

そして、私の会社と人にこれを継承させます。

public class Company : AContact
{
    int Id { get; set; }
    int Name { get; set; }
}

public class Person : AContact
{
    int Id { get; set; }
    string FirstName { get; set; }
    string MiddleName { get; set; }
    string LastName { get; set; }
    string Prefix { get; set; }
}

または、インターフェイスを作成することもできます。

public interface IContact
{
    ICollection<Phone> Phone { get; set; }
    ICollection<Address> Address { get; set; }
}

そして、インターフェースを実装します。

public class Company : IContact
{
    public int Id { get; set; }
    public int Name { get; set; }
    public ICollection<Phone> Phone { get; set;}
    public ICollection<Address> Address {get; set;}
}

ここで、抽象クラスとインターフェースの違いを理解しました。しかし、これはEntity Frameworkが機能するためにどのように実装されると想定されていますか?Webで少し検索すると、4.1の時点ではインターフェイスの機能を実行できないようです。つまり、抽象クラスを使用する必要があるということですか?または、使用するすべてのクラスで両方のプロパティを明示的に定義する必要がありますか?また、RavenDBのようなものもここで機能しますか?

4

1 に答える 1

1

どちらのオプションも可能です。

インターフェイスを使用すると、DbContext は次のようになります。

public class MyContext : DbContext
{
    public IDbSet<Company> Companies { get; set; }
    public IDbSet<Person> People { get; set; }
}

指定したインターフェイスを実装する会社と人物のオブジェクトが返されます。

抽象クラスを使用すると、次のようになります。

public class MyContext : DbContext
{
    public IDbSet<AContact> Contacts { get; set; }
}

抽象基本クラスを使用すると、1 つのエンティティ セットが作成されます。を使用するOfType<T>と、コレクションを特定の時間に絞り込むことができます。

RavenDB はまったく別のテーマです。これは非常にスムーズに動作する NoSql データベースです。オブジェクトを JSON にシリアル化し、保存するだけです。必要な (ほぼ) すべてのクラス構造を使用できます。

于 2012-12-10T08:12:55.130 に答える