我与一个订单和一些订单行存在一对多的关系。
从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; }
这似乎在某些计算机上也仍然有效,但在其他计算机上则无效。因此,这可能是错误的安装或某种安装,但是如果可以进行代码更改以明确解决该问题,那么我也对此感兴趣。
答案 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;