Я использую инфраструктуру сущностей 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_? Может это кому-то подсказка?
Audit
класс - person haim770   schedule 17.04.2015RowVersion
. Например:this.Property(e => e.RowVersion).IsRowVersion()
. - person haim770   schedule 17.04.2015EntityBaseConfig<Audit>
. Добавьте один, если у вас его еще нет - person haim770   schedule 17.04.2015