EF Core 2.1 с методом Seed и атрибутом NotMapped - PullRequest
0 голосов
/ 12 января 2019

У меня вопрос, почему мое свойство Strategy равно нулю, когда я получаю все DbSet из контекста? Как [NotMapped] свойство сделать видимым в моем бэкэнде?

Мой класс выглядит так:

public class Machine
{
    [Key]
    public int Id { get; set; }
    [NotMapped]
    public WorkStrategy Strategy { get; set; }

    public double GetManHours() => Strategy.TimeOfWork(HoursPerDay);
}

WorkStrategy - это абстрактный класс:

public abstract class WorkStrategy
{
    public abstract double TimeOfWork(double hours);
}

public class FarmStrategy : WorkStrategy
{
    public override double TimeOfWork(double hours) => // do things
}

public class CultivationStrategy : WorkStrategy
{
    public override double TimeOfWork(double hours) => //do things
}

Часть моего Seed метода, в котором я сеялка выглядит следующим образом:

//Machines
for(int i = 0; i < countOfMachines; i++)
{
    Machine machine = new Machine { Id = i + 1 };
    machine.Strategy = new FarmStrategy;
    modelBuilder.Entity<Machine>().HasData(machine);
}

Но когда я звоню Machines из БД:

var machines = _context.Machines;

Свойство Strategy имеет значение null. Не могли бы вы сказать, как добавить свойство [NotMapped] при заполнении базы данных? ? Это возможно?

EDIT

Когда я хочу добавить WorkStrategy как «не отображенный», я получаю сообщение об ошибке от EF при добавлении миграции:

Тип сущности 'WorkStrategy' требует определения первичного ключа

Но я не хочу делать таблицу для WorkStrategy.

EDIT Мой OnModelCreating в context класс:

protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Machine>().Ignore(x => x.Strategy);

        builder.Seed();
        base.OnModelCreating(builder);
    }

Это не работает, как [NotMapped]

Ответы [ 2 ]

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

Я думаю, что ваша проблема не в не отображенном атрибуте, а в структуре ваших классов. Если у вас есть флаг, какой тип стратегии необходим, и адаптируйте свойство-стратегию в зависимости от этого флага, чтобы инициализировать стратегию, если она пуста, вы можете оставить свой атрибут Notmapped-или Ignore-метод с Fluent-Api.

0 голосов
/ 12 января 2019

Вы можете использовать свободное игнорирование API вместо notmapped

modelBuilder.Entity<Machine>().Ignore(x => x.Strategy );
...