拥有所有实体派生自的BaseEntity类型或接口更好吗?

时间:2011-07-11 20:20:55

标签: entity-framework-4.1

目前我已经创建了一个基本实体类型,我的所有实体都将从中派生出来。

public abstract class BaseEntity
    {

        /// <summary>
        /// Key Field for all entities
        /// </summary>
        /// 
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }


        /// <summary>
        /// Date entity was created
        /// </summary>
        public DateTime DateCreated { get; set; }

        /// <summary>
        /// Last date Modified
        /// </summary>
        public DateTime DateModified { get; set; }

        /// <summary>
        /// keep track of Row Version used for concurrency
        /// </summary>
        [Timestamp]
        public Byte[] RowVersion { get; set; }

    }
}

我正在考虑将我的模型与实体框架分离,因此它不依赖于它。我想有另一个项目用于我的EF实现。所以,我想在该项目中包含将构成模型中关系的映射。

由于我的BaseEntity类是一个抽象类,因此保持我的[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]和[TimeStamp]属性的最佳方式是什么,以便它将使用fluent API应用于我的所有派生实体和单独的映射文件?我不认为我可以设置建模器来添加BaseEntity映射,因为它是一个抽象类。我应该创建一个具有所有基本功能的接口并重复所有实体的映射吗?

我正在使用EntityTypeConfiguration类并为我的所有实体创建单独的映射类。

2 个答案:

答案 0 :(得分:7)

您可以使用基类:

public abstract class BaseEntity
{
    public Guid Id { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public Byte[] RowVersion { get; set; }
}

现在,这取决于您是否要映射继承。我想你不想这样定义你的配置:

public class BaseEntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : BaseEntity
{
    public BaseEntityConfiguration()
    {
        HasKey(e => e.Id);
        // This is not very good - check http://stackoverflow.com/questions/6098972/guid-comb-strategy-in-ef4-1-codefirst/6100606#6100606
        Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(e => RowVersion).IsRowVersion();
    }
}    

现在,从BaseEntity派生的每个实体从BaseEntityConfiguration

派生出其配置

答案 1 :(得分:0)

类继承基不是好习惯。

在这些情况下,最好对组合进行优先级排序并优先考虑继承。

因此,您应该在每个实体中再添加一个代表具有BaseEntity类属性的元数据的类。

GL

Source