【问题标题】:EF Core 2.1 with Seed method and NotMapped attribute带有 Seed 方法和 NotMapped 属性的 EF Core 2.1
【发布时间】: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 制作表格。

编辑 我的OnModelCreatingcontext 班级:

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&lt;WorkStrategy&gt;
  • @DavidG 抱歉,当我删除 [NotMapped] 时,我得到了那个按摩师,已编辑
  • “播种”是将数据放入数据库的过程,如果您不希望将其放入数据库中,则不要对其进行播种。

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


【解决方案1】:

你可以使用fluent api ignore而不是notmapped

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

【讨论】:

  • @michasaucer 为什么在答案不起作用时接受了?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多