EF Core 2.1.1 Метод Seed с вызовом констурктора - PullRequest
0 голосов
/ 08 января 2019

Почему свойство, установленное в конструкторе класса заполнения, равно 0? У меня есть свой метод посева:

    public static void Seed(this ModelBuilder modelBuilder)
    {
        Random random = new Random();
        int range = 20; // for doubles

        int countOfWorkers = 10;

        modelBuilder.Entity<Farm>().HasData(Farm.GetFarm());

        for (int i = 0; i < countOfWorkers; i++)
        {
            modelBuilder.Entity<Driver>().HasData(
            new Driver
            {
                // i belive that constructor launch in here
                Id = i + 1,
                FarmId = 1,
                FirstName = "name" + i,
                LastName = "lastname" + i,
                UsdPerHour = Math.Round((random.NextDouble() * 20), 2),
                HoursPerDay = random.Next(1, 23),
                DaysOfWork = random.Next(1, 31)
            });
        }
    }

Driver класс имеет конструктор:

public class Driver : Worker
{
    // constructor
    public Driver() => BaseSalary = CountBaseSalary();

    public override double BaseSalary { get; set; }

    //this propertys like UsdPerHours are in my abstract 'Worker' class
    public override double CountBaseSalary() => UsdPerHour* HoursPerDay *DaysOfWork;

}

Это установленное значение BaseSalary, основанное на свойствах из Seed, таких как UsdPerHour, DaysOfWork и т. Д.

Исходя из кода выше, мое свойство BaseSalary в базе данных установлено в '0', все строки

Мой вопрос: мой метод CountBaseSalary из конструктора получает вызов, когда я начинаю заполнять мои данные? Возможно ли как-нибудь запустить метод CountBaseSalary после строк, которые нужны в этом методе? Где привести мой метод, чтобы получить значение, которое я хочу?

1 Ответ

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

Для Class, Constructor вызывается до Properties initialize. Таким образом, вам следует избегать установки значений свойств из Constructor на основе других свойств.

Попробуйте

for (int i = 0; i < countOfWorkers; i++)
{
    var driver = new Driver
    {
        // i belive that constructor launch in here
        Id = i + 1,
        FirstName = "name" + i,
        LastName = "lastname" + i,
        UsdPerHour = Math.Round((random.NextDouble() * 20), 2),
        HoursPerDay = random.Next(1, 23),
        DaysOfWork = random.Next(1, 31)
    };
    driver.BaseSalary = driver.CountBaseSalary();
    modelBuilder.Entity<Driver>().HasData(driver);
}
...