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