Я пытаюсь сохранить изменения в базе данных, используя 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; }
}
Как видите, у меня несколько детей, которые будут использовать одну и ту же валюту, и родитель также может использовать одну и ту же валюту, поэтому при попытке сохранить изменения я получаю ошибка, что существует сущность с тем же currencyID, которая уже отслеживается.
Я знаю, что одно решение - обнулить все свойства навигации перед попыткой сохранить изменения, это работает для сохранения данных в базу данных, но это ломает мой блейзер страница, так как я отображаю некоторые свойства для пользователя.
Я попытался использовать State.Unchanged вместо обнуления свойства навигации, но когда я перебираю все дочерние элементы и появляется второй дочерний элемент, который использует в той же валюте у меня есть ошибка, что сущность уже отслеживается.
Я также использовал .AsNoTracking () в своих запросах, чтобы получить валюту, но она также отслеживается, я думаю, это происходит, когда я используйте dbcontext.Add (Payment).
Есть ли другое решение? Возможно, есть способ проверить, находится ли объект уже в неизменном состоянии, чтобы я мог пропустить его во время итерации?
Спасибо за вашу помощь