具有种子方法和NotMapped属性的EF Core 2.1

时间:2019-01-12 20:42:24

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

我有一个问题,当我从上下文中获取所有Strategy时,为什么我的DbSet属性为null?如何使[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]属性 ?有可能吗?

编辑

当我想添加WorkStrategy而不是“未映射”时,我在添加迁移时收到EF错误:

  

实体类型“ WorkStrategy”要求定义主键

但是我不想为WorkStrategy制作表格。

编辑 我在OnModelCreating课堂上的context

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

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

它不能用作[NotMapped]

2 个答案:

答案 0 :(得分:1)

您可以使用流畅的api忽略功能来代替未映射的功能

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

答案 1 :(得分:0)

我认为您的问题不是未映射的属性,而是类的结构。 如果您有一个标记,则需要哪种策略类型,并根据该标记调整策略属性以初始化一个无效的策略,则可以使用Fluent-Api保留Notmapped-Attribute或Ignore-Method。