Проблема с базовым классом в EF Core 2.2 - PullRequest
0 голосов
/ 13 февраля 2019

У меня много классов выглядит следующим образом:

public class ModelOneConfiguration
{
    public ModelOneConfiguration(EntityTypeBuilder<ModelOne> entity)
    {
        entity.Property(e => e.Id).IsRequired().HasDefaultValueSql("NEWID()");
        entity.Property(e => e.CreatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnAdd();
        entity.Property(e => e.UpdatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnUpdate();
        entity.Property(e => e.FirstName).IsRequired();
        entity.Property(e => e.LastName).IsRequired();         
        entity.Property(e => e.Email).IsRequired();
    }

}

И вызывать его из класса контекста Db:

protected override void OnModelCreating(ModelBuilder builder)
{
    new ModelOneConfiguration(builder.Entity<ModelOne>());
    ….other classes as well…
    base.OnModelCreating(builder);       
}

Когда я выполняю миграцию, она отлично работает со следующими результатами:

Id = table.Column<Guid>(nullable: false, defaultValueSql: "NEWID()"),
CreatedAt = table.Column<DateTimeOffset>(nullable: false, defaultValueSql: "getutcdate()"),
UpdatedAt = table.Column<DateTimeOffset>(nullable: true, defaultValueSql: "getutcdate()"),
FirstName = table.Column<string>(nullable: false),
LastName = table.Column<string>(nullable: false),
Email = table.Column<string>(nullable: false)

Пока все хорошо.

Теперь я попытался обернуть Id, CreatedAt и updatedAt в базовый класс, чтобы использовать его со всеми другими моими классами конфигурации модели.Итак, что я сделал, я следовал этому примеру , на который ответил Иван Стоев.

Итак, для моего базового класса я сделал следующее:

public class BaseConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntities
{
    public virtual void Configure(EntityTypeBuilder<TEntity> entity)
    {
        entity.Property(e => e.Id).IsRequired().HasDefaultValueSql("NEWID()");
        entity.Property(e => e.CreatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnAdd();
        entity.Property(e => e.UpdatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnUpdate();
    }
}

Затем я расширил конфигурацию моей моделикласс:

public class ModelOneConfiguration : BaseConfiguration<ModelOne>
{
    public ModelOneConfiguration(EntityTypeBuilder<ModelOne> entity)
    {
        entity.Property(e => e.FirstName).IsRequired();
        entity.Property(e => e.LastName).IsRequired();
        entity.Property(e => e.Email).IsRequired();
    }
}

Теперь, когда я запускаю миграцию, генерируется следующее

Id = table.Column<Guid>(nullable: false),
CreatedAt = table.Column<DateTimeOffset>(nullable: false),
UpdatedAt = table.Column<DateTimeOffset>(nullable: true),
FirstName = table.Column<string>(nullable: false),
LastName = table.Column<string>(nullable: false),
Email = table.Column<string>(nullable: false)

Как мы видим, defaultValueSql: "NEWID()", defaultValueSql: "getutcdate()" просто отсутствуют в Id, CreatedAt и UpdatedAt.

И я использую Core 2.2 с EF core 2.2.

Мой вопрос очень прост:

Что я делаю неправильно и как это можно сделатьбыть исправленным?

1 Ответ

0 голосов
/ 13 февраля 2019

Ваш производный класс должен выполнять работу внутри метода Configure, а не в конструкторе.Добавьте для этого override и обязательно вызовите базовый метод Configure:

public class ModelOneConfiguration : BaseConfiguration<ModelOne>
{
    public override void Configure(EntityTypeBuilder<ModelOne> builder)
    {
        base.Configure(builder);

        entity.Property(e => e.FirstName).IsRequired();
        entity.Property(e => e.LastName).IsRequired();
        entity.Property(e => e.Email).IsRequired();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...