实体类型“订单”上的属性“ myFk”具有临时值

时间:2019-11-04 12:12:10

标签: c# entity-framework-core

我与一个订单和一些订单行存在一对多的关系。

从2.0更新运行时。 NetCore 2.2.7的版本,我已经开始收到此消息:

  

System.InvalidOperationException:实体上的属性'OrderId'   类型“ OrderLineDto”具有一个临时值。要么设置一个永久   明确地确定值,或确保将数据库配置为生成   该属性的值。

更新时没有任何变化,这个错误究竟是什么?在OrderlineDto中,我确实有一个OrderId,但是我从来没有做任何维护它的事情,也不认为我应该这样做。

简化后的代码如下:

Order o = new OrderDto() {Foo = "Foo"};
o.Lines.Add(new OrderlineDto(whatever) {Bar = "Bar"});
_db.Orders.Add(o);
_db.SaveChanges();

OrderlineDto首先是数据库,如下所示:

[Key]
[Column("Id_pk")]
public int Pk { get; set; }
public int OrderId { get; set; }
public virtual OrderDto Order { get; set; }

这似乎在某些计算机上也仍然有效,但在其他计算机上则无效。因此,这可能是错误的安装或某种安装,但是如果可以进行代码更改以明确解决该问题,那么我也对此感兴趣。

2 个答案:

答案 0 :(得分:2)

似乎实体框架无法识别一对多关系 您可以尝试将此代码添加到OnModelCreating()

 modelBuilder.Entity<OrderlineDto>()
      .HasOne(ol => ol.OrderDto)
      .WithMany()
      .HasForeignKey(p => p.OrderId);

然后添加迁移并检查数据库上是否有任何更新

答案 1 :(得分:0)

由于某种原因,该问题是错误的ChangeTracker。我的解决方案是在每次保存时手动分离所有内容。如果其他人搜索类似内容,我将在此处保留解决方案。

var changedEntriesCopy = _db.ChangeTracker.Entries().ToList();
await _db.SaveChangesAsync();
foreach (var entry in changedEntriesCopy)
    entry.State = EntityState.Detached;