Използвам рамка на обект 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) вместо timestamp.
Опитах се да поставя този ред във всеки конфигурационен файл, но получавам тази грешка.
this.Property(e => e.Audit.RowVersion).IsRowVersion();
Посочената схема не е валидна. Грешки: (36,14): грешка 2039: концептуалното странично свойство „RowVersion“ вече е картографирано към свойство за съхранение с тип „rowversion“. Ако концептуалното странично свойство е картографирано към множество свойства в модела за съхранение, уверете се, че всички свойства в модела за съхранение имат един и същи тип.
Но така или иначе не искам да пиша този ред във всеки файл. Как мога да накарам колоната Audit.RowVersion да се генерира като клеймо за време и в идеалния случай да я напиша веднъж, така че всички обекти, които прилагат IAudit, също да получат конфигурираните полета?
РЕДАКТИРАНЕ:
Сега добавих конфигурационен файл за обекта Audit, който изглежда така
public class AuditConfig : EntityTypeConfiguration<Audit>
{
public AuditConfig() : base()
{
this.Property(e => e.RowVersion)
.IsRowVersion();
}
}
И аз наричам това в метода OnModelCreating, ей така, преди другите извиквания на Configuration
modelBuilder.Configurations.Add(new AuditConfig());
Сега, когато стартирам моя проект, получавам следната грешка
Една таблица може да има само една колона с клеймо за време. Тъй като таблица „Прикачен файл“ вече има такъв, колоната „Audit_RowVersion“ не може да бъде добавена.
Ако погледна създадената досега база данни и таблица с прикачени файлове, тя има полетата в обекта Audit, но те нямат префикса 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