更新实体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 的外键”。它恰恰相反。
我努力了:
而是在 WorkerBuilder 类型上定义键关系。令人
SQLite Error 19: 'FOREIGN KEY constraint failed'.
惊讶的是,它仍然尝试在 Person 实体上定义键,这是错误的。删除一些特定的表达式,希望 EF 能够弄清楚关系本身。它没有;如果我提供的信息太少,它会尝试使用不存在的列|字段(例如“PersonID”,或者无法完全找出关系。
所以,我很难过。有没有人成功做到这一点?用简单的英语,
“一个人可能有也可能没有工人记录”(1:0);并且,“如果他们有工人记录,则两条记录具有相同的 ID。” (FK_W_ID__P_ID)