【问题标题】:EF Core 2.1.1 Seed method with consturctor callEF Core 2.1.1 带有构造函数调用的种子方法
【发布时间】:2019-06-03 09:26:33
【问题描述】:

为什么种子类的构造函数中设置的属性等于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 的属性,例如 UsdPerHourDaysOfWork 等。

根据上面的代码,我在数据库中的BaseSalary 属性设置为'0',所有行

我的问题是,当我开始播种我的数据时,我的方法CountBaseSalary 是否来自构造函数?是否有可能在此方法所需的行之后以某种方式运行方法CountBaseSalary?在哪里转换我的方法以获得我想要的价值?

【问题讨论】:

  • 除了数据播种之外,构造函数内的CountBaseSalary() 将始终返回0,因为属性尚未初始化并且具有默认值(0)。
  • 我知道,但也许有可能在初始化其他属性后在 Seed 中调用该函数而不从它执行static

标签: c# asp.net-core entity-framework-core seeding


【解决方案1】:

对于ClassConstructorProperties 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);
}

【讨论】:

  • 您的解决方案是有道理的,但是当我以与您相同的方式对其进行编码时,Salary 仍然等于 0
  • @michasaucer 你有UsdPerHour 的期望值吗?
  • @michasaucer 尝试从Driver中删除public override double BaseSalary { get; set; }
猜你喜欢
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多