У меня есть метод в моем контроллере, который, если пользователь нажмет кнопку, будет подписаться на билет или удалить их из подписки, если они уже подписаны. Он делает это, добавляя TicketId и UserId в таблицу подписки на билеты, и если эта запись уже существует, она должна удалить ее из таблицы. У меня есть добавление части подписки, но я не могу получить удаление из таблицы для работы. Вот код, который я для удаления:Удаление записи с использованием составного первичного ключа в MVC
var ticketId = db.Tickets.FirstOrDefault(t => t.TicketNumber == ticketNumber).TicketId;
var userId = db.Users.FirstOrDefault(u => u.NTUserName.Equals(User.Identity.Name)).UserId;
bool subscriptionExists = db.TicketSubscriptions.Any(ts => ts.TicketId.Equals(ticketId) && ts.UserId == userId);
if (subscriptionExists)
{
TicketSubscription ticketSubscription = db.TicketSubscriptions.Find(ticketId,userId);
ticketSubscriptions.Delete(ticketSubscription);
}
internal DataContext context;
internal DbSet<TEntity> dbSet;
public RepositoryBase(DataContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual void Delete(TEntity entity)
{
if (context.Entry(entity).State == EntityState.Detached)
dbSet.Attach(entity);
dbSet.Remove(entity);
}
К сожалению, я получаю эту ошибку на (лица) линии dbSet.Remove:
исключение типа «System.InvalidOperationException» произошло в EntityFramework.dll, но не был обработан в пользовательском коде
Дополнительная информация: объект лицо не может ссылаться несколькими экземплярами IEntityChangeTracker.
и нет внутреннего исключения.
Отключить тему: вы либо пользователь 'FirstOrDefault', либо проверяете, равен ли результат null перед его использованием, либо вы переходите напрямую к' First', используя 'FirstOrDefault', а затем доступ к результату напрямую не имеет смысла. – Albireo
Что такое 'context' и' dbSet'? Если я понимаю, что это два разных EFConexts. Если это так - используйте только один контекст для работы с вашим объектом. –
Вы также можете переписать свой код, чтобы выполнить прямой поиск 'TicketSubscriptions', а затем проверить, найдена подписка или нет. 'db.TicketSubscriptions.SingleOrDefault (a => a.Ticket.TicketNumber == ticketNumber && a.User.NTUserName == User.Identity.Name)'. – Albireo