【发布时间】:2019-06-07 09:20:22
【问题描述】:
我有一个问题,当我从上下文中获取所有 DbSet 时,为什么我的 Strategy 属性为空?如何让[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);
}
但是当我从 DB 拨打Machines 时:
var machines = _context.Machines;
Strategy 属性为空。你能告诉我,如何在播种数据库时附加[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]
【问题讨论】:
-
未映射属性表示“如果从数据库上下文映射,则忽略此属性”。你需要自己填充它。
-
如果您将用作 Value 对象,则不需要为 workStrategy 创建新表。查找 Value 对象和 [Owned] 属性,它可能是您想要的。
-
如果您有
NotMapped属性,那么您不应该收到该错误消息。您是否在其他地方使用过该模型?也许它甚至是DbSet<WorkStrategy>? -
@DavidG 抱歉,当我删除 [NotMapped] 时,我得到了那个按摩师,已编辑
-
“播种”是将数据放入数据库的过程,如果您不希望将其放入数据库中,则不要对其进行播种。
标签: c# asp.net-core entity-framework-core seeding