【问题标题】:The property 'myFk' on entity type 'Order' has a temporary value实体类型“订单”上的属性“myFk”具有临时值
【发布时间】:2019-11-06 22:35:48
【问题描述】:

我与一个订单和一些订单线有一对多的关系。

从 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; }

这似乎仍然适用于某些计算机,但不适用于其他计算机。所以它可能是一个糟糕的安装或其他东西,但如果可以进行代码更改以明确解决它,那么我也对此感兴趣。

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 2019-07-12
        • 2011-12-09
        • 1970-01-01
        相关资源
        最近更新 更多