为什么在EF存储库模式的POCO上使用Base类?

时间:2012-05-10 17:29:39

标签: entity-framework poco

我已经看过很多EF POCO示例,其中每个POCO类都继承了一个基本实体类或实现了一个IEntity接口。

我有点理解为什么会这样使用,但我无法看到它会在所有情况下都有效,除非我错过了什么。

实体基类可能如下所示:

public class Entity
{
    #region Primitive Properties
    [Key]
    public int Id { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    [Timestamp]
    public byte[] rowversion { get; set; }
    #endregion
}

......具体的POCO类看起来像这样:

public class BlogCategory : Entity
{
    #region Properties

    [Required(ErrorMessage = "Category Name is required.")]
    public string CategoryName { get; set; }
    public virtual ICollection<Blog> BlogList { get; set; }

    #endregion
}

当我的所有类都包含一个主键属性时,这很好,但是当我有多对多关系时会发生什么?通常在多对多关系中,实体具有表示此实体的主键的双重属性。

如:

public class ClaimQuestionAnswer : Entity <-- this will not work, will it?
{
    [Key]
    public int QuestionId { get; set; }
    [Key]
    public int AnswerId { get; set; }
    public string Answer { get; set; }
    public byte[] rowversion { get; set; }
}

这个特定的POCO会不会继承基类吗?

任何澄清都表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:1)

您可能只看到了不使用任何具有复合键的实体类的示例。否则他们遇到了你现在面临的同样问题。

多对多关系不是最好的例子,因为在真正的多对多关系中,连接表在模型中没有对应的实体。但是,您可能出于任何其他原因在实体中使用复合键,或者您可能拥有其键必须具有其他类型(stringlongGuid或其他类型的实体的实体。

在这种情况下,您无法使用基类,因为该键不再是所有实体的公共属性。您可以将密钥移出基类并将其放入不同的派生类中 - 只有DateCreatedDateModifiedrowversion是常用属性。或者,您可以为正在使用的不同键类型创建多个基类。

这完全取决于您希望在所有实体中支持的常见属性。