0

我使用实体框架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_前缀?也许这是对某人的线索?

+0

显示您的审计类 – haim770

+0

对不起我的错误,现在加入 – Gillardo

+0

您需要配置您的'RowVersion'。例如:'this.Property(e => e.RowVersion).IsRowVersion()'。 – haim770

回答

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; } 
} 

您可以添加[时间戳]属性为您的变量。

+0

如果我删除AuditConfig并尝试你的答案,我得到一个错误,说一个表只能有一个时间戳列。由于表'附件'已经有一个,因此无法添加'Audit_RowVersion'列。 – Gillardo