我只是想在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这样的东西也可以在那里工作吗?
答案 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,并为您存储它们。您可以(几乎)使用您想要的每个类结构。