我使用實體框架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