代码之家  ›  专栏  ›  技术社区  ›  michasaucer

ef core 2.1,具有seed方法和notmapped属性

  •  -2
  • michasaucer  · 技术社区  · 7 年前

    我有个问题,为什么我的 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 从DB:

    var machines = _context.Machines;
    

    这个 策略 属性为空。你能告诉我怎么连接吗 [未映射] 设置数据库种子时的属性 ?它拥有吗?

    编辑

    当我想添加 工作策略 由于没有“notmapped”,我在添加迁移时从ef中得到一个错误:

    实体类型“workstrategy”需要定义主键

    但我不想为工作策略做一张桌子。

    编辑 我的 OnModelCreating 在里面 context 班级:

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

    它不起作用 [未映射]

    2 回复  |  直到 7 年前
        1
  •  1
  •   NaDeR Star    7 年前

    可以使用fluent api ignore而不是notmapped

    modelBuilder.Entity<Machine>().Ignore(x => x.Strategy );
    
        2
  •  0
  •   Nikolaus    7 年前

    我认为您的问题不是未映射的属性,而是类的结构。 如果您有一个标志,需要哪种类型的策略,并根据该标志调整Strategy属性以初始化策略如果该标志为空,则可以使用Fluent API保留notmapped属性或ignore方法。