【发布时间】:2015-12-17 14:31:33
【问题描述】:
我的控制器中有一个方法,如果用户单击一个按钮,它将为他们订阅一张票,如果他们已经订阅,则将他们从订阅中删除。它通过将 TicketId 和 UserId 添加到票证订阅表来做到这一点,如果该记录已经存在,则应该将其从表中删除。我有添加订阅部分的工作,但我无法从表中删除它来工作。这是我的删除代码:
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(entity) 行上收到此错误:
“System.InvalidOperationException”类型的异常发生在 EntityFramework.dll 但未在用户代码中处理
附加信息:实体对象不能被 IEntityChangeTracker 的多个实例。
并且没有内部异常。
【问题讨论】:
-
题外话:你要么使用
FirstOrDefault并在使用之前检查结果是否为空,或者你直接使用First,使用FirstOrDefault然后直接访问结果没有任何意义. -
什么是
context和dbSet?如果我理解正确,它是 2 个不同的 EFConexts。如果是这样 - 仅使用一个上下文来操作您的实体。 -
您还可以重写代码以执行直接
TicketSubscriptions查找,然后检查是否找到订阅。db.TicketSubscriptions.SingleOrDefault(a => a.Ticket.TicketNumber == ticketNumber && a.User.NTUserName == User.Identity.Name).
标签: c# entity-framework datacontext