Экземпляр типа сущности «Палуба» не может быть отслежен, поскольку другой экземпляр со значением ключа «{CardId: 578}» уже отслеживается - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в EF-Core и пробую. Я застрял в проблеме, где я хочу обновить или вставить записи в таблицу MySQL.

Модель выглядит следующим образом:

    public partial class Decks
    {
        public int DecklistId { get; set; }
        public int CardId { get; set; }
        public int Amount { get; set; }
        public bool Maindeck { get; set; }
        public virtual Cards Card { get; set; }
    }
}

Конфигурация объекта является следующей:

modelBuilder.Entity<Decks>(entity =>
                {
                    entity.HasKey(e => new { e.DecklistId, e.CardId, e.Maindeck })
                        .HasName("PRIMARY"); ;

                    entity.HasIndex(e => e.CardId);

                    entity.ToTable("decks");

                    entity.Property(e => e.DecklistId).HasColumnName("decklistID");

                    entity.Property(e => e.CardId).HasColumnName("cardID");

                    entity.Property(e => e.Maindeck).HasColumnName("maindeck");

                    entity.Property(e => e.Amount).HasColumnName("amount");

                    entity.HasOne(e => e.Card)
                        .WithOne()
                        .HasPrincipalKey<Decks>(b => b.CardId);
                });

По крайней мере в моем репо я использую этот код, чтобы выяснить, должны ли данные быть обновлены или вставлены.

public async Task<StandardResponse> UpdateDeck(List<Decks> deckCards)
        {
            StandardResponse errors = new StandardResponse { message = null, status = 200 };
            try
            {
                deckCards.ForEach(x =>
               {
                   Decks existingCard = _context.Decks.Find(x.DecklistId,x.CardId, x.Maindeck);
                   if (existingCard == null)
                   {
                       _context.Decks.Add(x); <---- Here occurs the Error
                   }
                   else
                   {
                       _context.Entry(existingCard).CurrentValues.SetValues(x);
                   }
                   _context.SaveChanges();
               });
            }
            catch (DbUpdateException ex)
            {
                return new StandardResponse { message = ex, status = 501 };
            }
            return new StandardResponse { message = "Deck updated!", status = 200 };
        }

Проблема появляется, когда мне нужно объект, который имеет тот же DecklistId и тот же CardId. Даже если свойство Maindeck отличается, я получаю ошибку и не могу объяснить, почему ... Вот список объектов, которые я хочу вставить / обновить.

Первый объект будет добавлен. Второй объект, конечно же, не найден в базе данных, и в Add-Statement происходит ошибка.

[ 
{ 
    "decklistId": 28,
    "cardId": 578,
    "amount": 4,
    "maindeck": true
},
{
    "decklistId": 28,
    "cardId": 578,
    "amount": 4,
    "maindeck": false
}
]

Что бы это могло быть?

Спасибо за помощь, ребята!

...