我正在使用实体框架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_前缀?也许这是某人的线索?
答案 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]属性。