2015-12-17 5 views
0

У меня есть метод в моем контроллере, который, если пользователь нажмет кнопку, будет подписаться на билет или удалить их из подписки, если они уже подписаны. Он делает это, добавляя 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.

и нет внутреннего исключения.

+0

Отключить тему: вы либо пользователь 'FirstOrDefault', либо проверяете, равен ли результат null перед его использованием, либо вы переходите напрямую к' First', используя 'FirstOrDefault', а затем доступ к результату напрямую не имеет смысла. – Albireo

+0

Что такое 'context' и' dbSet'? Если я понимаю, что это два разных EFConexts. Если это так - используйте только один контекст для работы с вашим объектом. –

+0

Вы также можете переписать свой код, чтобы выполнить прямой поиск 'TicketSubscriptions', а затем проверить, найдена подписка или нет. 'db.TicketSubscriptions.SingleOrDefault (a => a.Ticket.TicketNumber == ticketNumber && a.User.NTUserName == User.Identity.Name)'. – Albireo

ответ

0

Вот как я решил проблему.

1) Я добавил первичный ключ, который не был составной

2) Я изменил метод repositorybase для удаления, чтобы быть следующим:

public virtual void Delete(object id) 
{ 
    TEntity entity = dbSet.Find(id); 

    if (context.Entry(entity).State == EntityState.Detached) 
      dbSet.Attach(entity); 

    dbSet.Remove(entity); 
    context.SaveChanges(); 

} 

3) Затем я перешел в новый основной ключ к этому методу

Смежные вопросы