POCO对象是继承还是抽象?

时间:2012-12-09 23:13:26

标签: entity-framework interface abstract-class poco

我只是想在POCO中模拟数据模型。但我对某些事情有点困惑。让我们假设这个例子我将使用ORM的Entity Framework。首先,我有一个电话和地址类:

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; }
}

接下来我有一个人和公司班:

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; }
}

假设我希望Person和company都有电话或地址列表,从逻辑上讲我从代码角度考虑这个问题的方式就是创建一个抽象类,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的功能呢?从网上的一点点搜索看来,从4.1开始你不能做界面的东西,所以这是否意味着我必须使用抽象类?或者我只需要在我想要使用它们的每个类中明确定义这两个属性吗?那么像RavenDB这样的东西也可以在那里工作吗?

1 个答案:

答案 0 :(得分: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; }
}

使用抽象基类,您将拥有一个实体集。使用OfType<T>,您可以将集合过滤到特定时间。

RavenDB是另一个主题。这是一个非常流畅的NoSql数据库。它将您的对象序列化为JSON,并为您存储它们。您可以(几乎)使用您想要的每个类结构。