具有时间戳/行转换字段的实体对象属性?

时间:2015-04-17 11:16:28

标签: c# .net entity-framework entity-framework-5 entity-framework-6

我正在使用实体框架6,我有一个名为EntityBase的基本实体,非常简单

public abstract class EntityBase : IEntityBase
{
    public virtual long Id { get; set; }
}

我的每个实体都从此继承。现在一些实体需要审计信息,所以我首先创建了一个名为IAudit的接口

public interface IAudit
{
    Audit Audit { get; set; }
}

审计对象如此

public class Audit
{
    public bool IsDeleted { get; set; }

    public DateTime? DeletedDate { get; set; }

    public long? DeletedByUserId { get; set; }

    public DateTime CreatedDate { get; set; }

    public long CreatedByUserId { get; set; }

    public DateTime UpdatedDate { get; set; }

    public long UpdatedByUserId { get; set; }

    public byte[] RowVersion { get; set; }
}

如果实体需要审核信息,我会应用此界面。这是一个例子

public class Attachment : EntityBase, IAudit
{
    #region IAudit

    public Audit Audit { get; set; }

    #endregion

    public string Name { get; set; }
}

我首先使用代码,所以现在在我的DbContext中,我在我的OnModelCreating方法中有这个

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Configurations.Add(new AttachmentConfig());
}

这是我的AttachmentConfig文件,它继承自EntityBaseConfig,两者都包含在下面

public abstract class EntityBaseConfig<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : EntityBase
{
    public EntityBaseConfig()
    {
        this.HasKey(e => e.Id);
    }
}

class AttachmentConfig : EntityBaseConfig<Attachment>
{
    public AttachmentConfig()
        : base()
    {
        this.Property(e => e.Name)
            .HasMaxLength(255)
            .IsRequired();

    }
}

现在,当我的表创建时,Attachment表具有我期望的列,但Audit_RowVersion是varbinary(max)而不是timestamp。

我试图将此行放在每个配置文件中,但是会收到此错误。

this.Property(e => e.Audit.RowVersion).IsRowVersion();
  

指定的架构无效。错误:(36,14):错误2039:   概念性的财产&#39; RowVersion&#39;已经映射到了   类型&#39; rowversion&#39;的存储属性。如果是概念方面   property被映射到存储模型中的多个属性make   确保存储模型中的所有属性都具有相同的类型。

但我不想在每个文件中都写这行。如何将Audit.RowVersion列生成为时间戳,理想情况下将其写入一次,以便实现IAudit的所有对象也获取配置的字段?

编辑:

我现在已经为Audit对象添加了一个配置文件,如下所示

public class AuditConfig : EntityTypeConfiguration<Audit>
{
    public AuditConfig() : base()
    {
        this.Property(e => e.RowVersion)
            .IsRowVersion();
    }
}

我在OnModelCreating方法中调用它,就像这样,在其他Configuration调用之前

modelBuilder.Configurations.Add(new AuditConfig());

现在,当我运行我的项目时,我收到以下错误

  

一个表只能有一个时间戳列。因为表&#39;附件&#39;   已经有一个,专栏&#39; Audit_RowVersion&#39;无法添加。

如果我查看到目前为止创建的数据库和附件表,它有Audit对象中的字段,但它们没有Audit_前缀?也许这是某人的线索?

1 个答案:

答案 0 :(得分:0)

您可以使用DataAnnotations。

在您的模型类中

public class Audit
{
    public bool IsDeleted { get; set; }

    public DateTime? DeletedDate { get; set; }

    public long? DeletedByUserId { get; set; }

    public DateTime CreatedDate { get; set; }

    public long CreatedByUserId { get; set; }

    public DateTime UpdatedDate { get; set; }

    public long UpdatedByUserId { get; set; }

    [TimeStamp]
    public byte[] RowVersion { get; set; }
}

您可以为变量添加[TimeStamp]属性。