1

更新实体Persons我收到以下错误:

System.InvalidOperationException: The property 'ID' on entity type 'Person' has a temporary value. Either set a permanent value explicitly or ensure that the database is configured to generate values for this property.
   at Microsoft.EntityFrameworkCore....

这已经在几个地方讨论 过, EF Core 团队报告了一个类似的问题。但是,其中一篇文章是关于实体的多次更新,而一对多的解决方案在这里不起作用;此外,我不能让一个 ID 列为空,而是更喜欢使用流畅的 API 配置。文档示例也不起作用,所以我在这里问。

场景是我将旧的 ASP.NET MVC 4 项目升级到 ASP.NET MVC Core,因此我从 EF 6.1 升级到 EF Core 2.1。如果它解决了这个问题,我会很高兴地转向 2.2;我想当我开始的时候它还处于预发布阶段。

这是我的实体的(可笑的)简化版本:

public class Person
{
    public int ID { get; set; }
    public string name { get; set; }
    public virtual Worker Worker { get; set; }
}

public class Worker
{
    public int ID { get; set; }
    public string somePersonalDetails { get; set; }
    public virtual Person Person { get; set; }
    // other relationships exist
}

我正在使用流畅的 API 配置:

public class PersonBuilder
{
    public PersonBuilder(EntityTypeBuilder<Person> entity)
    {
        entity.HasKey(k => k.ID);
        entity.HasOne(p => p.Worker)
            .WithOne(p => p.Person)
            .HasForeignKey<Person>(p => p.ID)
            //.IsRequired(false) //?
            .OnDelete(DeleteBehavior.Cascade);
    }
}

public class WorkerBuilder
{
    public WorkerBuilder(EntityTypeBuilder<Worker> entity)
    {
        entity.HasKey(k => k.ID);
        // other relationships are defined
    }
}

public override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Configurations<Person>().Add(typeof(PersonBuilder));
    builder.Configurations<Worker>().Add(typeof(WorkerBuilder));
}

像这样拆分它的原因是因为我从我们剩余的 EF 4/5/6 配置中调整了它。耶遗留代码。尽管如此,它仍然有效(对于其他定义的类型)。我正在阅读的方式是“在相关Worker对象上定义一个指向该对象 ID 的外键”。它恰恰相反。

我努力了:

  1. 而是在 WorkerBuilder 类型上定义键关系。令人SQLite Error 19: 'FOREIGN KEY constraint failed'.惊讶的是,它仍然尝试在 Person 实体上定义键,这是错误的。

  2. 删除一些特定的表达式,希望 EF 能够弄清楚关系本身。它没有;如果我提供的信息太少,它会尝试使用不存在的列|字段(例如“PersonID”,或者无法完全找出关系。

所以,我很难过。有没有人成功做到这一点?用简单的英语,

“一个人可能有也可能没有工人记录”(1:0);并且,“如果他们有工人记录,则两条记录具有相同的 ID。” (FK_W_ID__P_ID)

4

1 回答 1

0

编写模型类如下:

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }

    public virtual Worker Worker { get; set; }
}

public class Worker
{
    public int PersonId { get; set; }
    public string somePersonalDetails { get; set; }
    public virtual Person Person { get; set; }

    // other relationships exist
}

然后在PersonConfigurationand中WorkerConfiguration

public class PersonConfiguration : IEntityTypeConfiguration<Person>
{
    public void Configure(EntityTypeBuilder<Person> builder)
    {
       builder.HasKey(u => u.PersonId);
    }
}

public class WorkerConfiguration : IEntityTypeConfiguration<Worker>
{
    public void Configure(EntityTypeBuilder<Worker> builder)
    {
       builder.HasKey(u => u.PersonId);
       builder.HasOne(u => u.Person)
           .WithOne(b => b.Worker)
           .HasForeignKey<Worker>(b => b.PersonId);
    }
}

然后OnModelCreatingDbContext

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.ApplyConfiguration(new PersonConfiguration());
    modelBuilder.ApplyConfiguration(new WorkerConfiguration());
}
于 2018-12-31T08:24:48.813 回答