Свойство на обект на обект с поле за клеймо за време/версия на ред?

Използвам рамка на обект 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_? Може би това е улика за някого?


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 и опитам вашия отговор, получавам грешка, която казва, че таблицата може да има само една колона с клеймо за време. Тъй като таблица „Прикачен файл“ вече има такъв, колоната „Audit_RowVersion“ не може да бъде добавена. - person Gillardo; 17.04.2015