我使用实体框架6,我有叫EntityBase基地实体,像这样具有timestamp/rowversion字段的实体对象属性?
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();
}
}
现在,当创建我的表,附件表中有我期望列,但Audit_RowVersion是VARBINARY(最大值),而不是时间戳。
我试图把这一行放在每个配置文件,但得到这个错误。指定
this.Property(e => e.Audit.RowVersion).IsRowVersion();
模式是无效的。错误:(36,14):错误2039: 概念性侧属性“RowVersion”已被映射到类型为“rowversion”的 存储属性。如果概念端 属性映射到存储模型中的多个属性,请确保 确保存储模型中的所有属性具有相同的类型。
但我不想在每个文件中写这行。我如何获得Audit.RowVersion列作为时间戳生成,理想情况下只写一次,以便实现IAudit的所有对象都可以获取配置的字段?
编辑:
我现在已经增加了对审计对象的一个配置文件,它看起来像这样
public class AuditConfig : EntityTypeConfiguration<Audit>
{
public AuditConfig() : base()
{
this.Property(e => e.RowVersion)
.IsRowVersion();
}
}
而且我称这种现象为OnModelCreating方法,像这样,其他配置调用之前
modelBuilder.Configurations.Add(new AuditConfig());
现在,当我跑我的项目,我得到以下错误
表只能有一个时间戳列。由于表'附件' 已经有一个,因此无法添加'Audit_RowVersion'列。
如果我查看到目前为止创建的数据库和附件表,它具有审核对象中的字段,但它们没有Audit_前缀?也许这是对某人的线索?
显示您的审计类 – haim770
对不起我的错误,现在加入 – Gillardo
您需要配置您的'RowVersion'。例如:'this.Property(e => e.RowVersion).IsRowVersion()'。 – haim770