0

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

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

假设我希望 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;}
}

现在我明白了抽象类和接口之间的区别。但是这应该如何实现实体框架的功能呢?从网上的一些搜索看来,从 4.1 开始,你不能做接口的事情,这是否意味着我必须使用抽象类?或者我是否只需要在我想使用它们的每个类中明确定义这两个属性?另外,像 RavenDB 这样的东西也可以在那里工作吗?

4

1 回答 1

1

这两种选择都是可能的。

使用您的界面时,您的 DbContext 将如下所示:

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

您将获得也恰好实现了您指定的接口的 Companies 和 People 对象。

使用抽象类时,您将拥有以下内容:

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

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

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

于 2012-12-10T08:12:55.130 回答