首页 > 解决方案 > EF Core 2.1.1 带有构造函数调用的种子方法

问题描述

为什么种子类的构造函数中设置的属性等于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在此方法所需的行之后以某种方式运行方法?在哪里使用我的方法来获得我想要的价值?

标签: c#asp.net-coreentity-framework-coreseeding

解决方案


因为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);
}

推荐阅读