Как сохранить изменения в EF Core 3.1.3 во многих отношениях? - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь сохранить изменения в базе данных, используя 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).

Есть ли другое решение? Возможно, есть способ проверить, находится ли объект уже в неизменном состоянии, чтобы я мог пропустить его во время итерации?

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 12 апреля 2020

В итоге я создал новый экземпляр Payment и скопировал только информацию, которую хотел сохранить, в новый экземпляр. Таким образом, я отделил представление от модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...