C# EF Core 2.1,带种子方法和NotMapped属性
我有一个问题,当我从上下文获取所有C# EF Core 2.1,带种子方法和NotMapped属性,c#,asp.net-core,entity-framework-core,seeding,C#,Asp.net Core,Entity Framework Core,Seeding,我有一个问题,当我从上下文获取所有DbSet时,为什么我的Strategy属性为空?如何使属性在我的后端可见 我的班级是这样的: public class Machine { [Key] public int Id { get; set; } [NotMapped] public WorkStrategy Strategy { get; set; } public double GetManHours() => Strategy.TimeOfWor
DbSet
时,为什么我的Strategy
属性为空?如何使属性在我的后端可见
我的班级是这样的:
public class Machine
{
[Key]
public int Id { get; set; }
[NotMapped]
public WorkStrategy Strategy { get; set; }
public double GetManHours() => Strategy.TimeOfWork(HoursPerDay);
}
//Machines
for(int i = 0; i < countOfMachines; i++)
{
Machine machine = new Machine { Id = i + 1 };
machine.Strategy = new FarmStrategy;
modelBuilder.Entity<Machine>().HasData(machine);
}
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
}
我的播种
方法的一部分,其中播种机如下所示:
public class Machine
{
[Key]
public int Id { get; set; }
[NotMapped]
public WorkStrategy Strategy { get; set; }
public double GetManHours() => Strategy.TimeOfWork(HoursPerDay);
}
//Machines
for(int i = 0; i < countOfMachines; i++)
{
Machine machine = new Machine { Id = i + 1 };
machine.Strategy = new FarmStrategy;
modelBuilder.Entity<Machine>().HasData(machine);
}
策略
属性为空。您能告诉我,在为数据库设定种子时如何附加[NotMapped]
属性吗
? 可能吗
编辑
当我想将WorkStrategy
添加为非“notmapped”时,我在添加迁移时从EF收到一个错误:
实体类型“WorkStrategy”需要定义主键
但是我不想为工作策略做一张桌子
编辑
在上下文类中创建模型时的我的:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Machine>().Ignore(x => x.Strategy);
builder.Seed();
base.OnModelCreating(builder);
}
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.Entity().Ignore(x=>x.Strategy);
builder.Seed();
基于模型创建(生成器);
}
它的工作方式不是[NotMapped]
您可以使用fluent api ignore而不是NotMapped
modelBuilder.Entity<Machine>().Ignore(x => x.Strategy );
modelBuilder.Entity().Ignore(x=>x.Strategy);
我认为您的问题不在于未映射属性,而在于类的结构。
如果您有一个标志,需要哪种类型的策略,并根据该标志调整策略属性,以在该标志为空时初始化策略,则可以使用Fluent Api保留Notmapped属性或Ignore方法。not mapped属性表示“如果从db上下文映射,则忽略此属性”。您需要自己填充它。如果要用作值对象,则不需要为workStrategy创建新表。查找Value对象和[Owned]属性,它可能是您想要的。如果您具有NotMapped
属性,则不应收到该错误消息。你有没有在别的地方用过这个模型?也许它甚至是一个DbSet
?@DavidG抱歉,当我删除[NotMapped]时,我得到了那个massege,编辑的“种子”是将数据放入数据库的过程,如果你不想让它进入数据库,那么你就不给它种子。@michasaucer为什么你在它不起作用的时候接受这个答案?