Свойство объекта Entity с полем timestamp/rowversion?

Я использую инфраструктуру сущностей 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();

    }
}

Теперь, когда моя таблица создана, таблица вложений имеет ожидаемые столбцы, но Audit_RowVersion имеет значение varbinary(max) вместо отметки времени.

Я пытался поместить эту строку в каждый файл конфигурации, но получаю эту ошибку.

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());

Теперь, когда я запускаю свой проект, я получаю следующую ошибку

В таблице может быть только один столбец меток времени. Поскольку в таблице «Attachment» уже есть столбец «Audit_RowVersion», добавить его невозможно.

Если я посмотрю на созданную базу данных и таблицу вложений, у нее есть поля в объекте аудита, но у них нет префикса Audit_? Может это кому-то подсказка?


person Gillardo    schedule 17.04.2015    source источник
comment
Покажи свой Audit класс   -  person haim770    schedule 17.04.2015
comment
Извините за ошибку, добавил сейчас   -  person Gillardo    schedule 17.04.2015
comment
Вам необходимо настроить RowVersion. Например: this.Property(e => e.RowVersion).IsRowVersion().   -  person haim770    schedule 17.04.2015
comment
this.Property(e => e.RowVersion).IsRowVersion() не существует?   -  person Gillardo    schedule 17.04.2015
comment
Вам нужно позвонить на EntityBaseConfig<Audit>. Добавьте один, если у вас его еще нет   -  person haim770    schedule 17.04.2015
comment
Обновленный вопрос .... все еще не работает   -  person Gillardo    schedule 17.04.2015


Ответы (1)


Вы можете использовать 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] для своей переменной.

person sercanD    schedule 17.04.2015
comment
Если я удалю AuditConfig и попробую ваш ответ, я получу сообщение об ошибке: в таблице может быть только один столбец меток времени. Поскольку в таблице «Attachment» уже есть столбец «Audit_RowVersion», добавить его нельзя. - person Gillardo; 17.04.2015