【发布时间】:2020-04-10 14:10:02
【问题描述】:
我正在尝试使用带有 blazor 页面的 EF Core 3.1.3、.net core 3.1 在数据库上保存更改。该模型包含多个孩子,每个孩子都有另一个孩子,可能是同一个实体。这是一个示例代码:
public class Currency
{
[Key]
public int CurrencyID { get; set; }
public string Country{ get; set; }
public string Name{ get; set; }
public string ISOCode{ get; set; }
public bool Active{ get; set; }
}
public class PaymentDetail
{
[Key]
public int PaymentDetailID{ get; set; }
public DateTime Date{ get; set; }
public decimal Amount{ get; set; }
[ForeignKey("CurrencyID")]
public int CurrencyID{ get; set; }
public Moneda Currency{ get; set; }
}
public class Payment
{
[Key]
public int PaymentID{ get; set; }
public string ReferenceNumber{ get; set; }
public ICollection<PaymentDetail> PaymentDetail{ get; set; }
[ForeignKey("CurrencyID")]
public int CurrencyID{ get; set; }
public Currency Currency{ get; set; }
public decimal TotalAmount{ get; set; }
}
如您所见,我有多个将使用相同货币的子级,而父级也可能使用相同的货币,因此当我尝试保存更改时,我收到一个错误,指出已经存在具有相同货币 ID 的实体被跟踪。
我知道一种解决方案是在尝试保存更改之前取消所有导航属性,这适用于将数据保存到数据库中,但由于我正在向用户显示一些属性,因此会破坏我的 blazor 页面。
我尝试使用 State.Unchanged 而不是使导航属性无效,但是当我遍历所有子项并且有第二个使用相同货币的子项时,我会收到错误,即实体已被跟踪。
我还在查询中使用了 .AsNoTracking() 来获取货币,但它也在被跟踪,我想当我使用 dbcontext.Add(Payment) 时会发生这种情况。
还有其他解决方案吗?也许是一种检查实体是否已经处于未更改状态以便我可以在迭代期间跳过它的方法?
感谢您的帮助
【问题讨论】:
标签: c# .net-core-3.1 entity-framework-core-3.1