2

我见过许多 EF POCO 示例,其中每个 POCO 类都继承了一个基 Entity 类或实现了一个 IEntity 接口。

我有点理解为什么要使用它,但我看不出它在所有情况下都有效,除非我遗漏了一些东西。

Entity 基类可能如下所示:

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 不会继承基类吗?

任何澄清表示赞赏。

谢谢。

4

1 回答 1

1

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

多对多关系不是最好的例子,因为在真正的多对多关系中,连接表在模型中没有对应的实体。但是您可能出于任何其他原因在实体中拥有复合键,或者您可能拥有其键只需要具有另一种类型(string、、longGuid其他)的实体。

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

这完全取决于您希望在所有实体中支持哪些公共属性。

于 2012-05-10T18:05:06.760 回答