我的控制器中有一个方法,如果用户单击一个按钮,它将订阅它们或者如果订阅已经订阅则将它们从订阅中删除。它通过将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(实体)行上遇到了这个错误:
类型&#39; System.InvalidOperationException&#39;的例外情况发生在 EntityFramework.dll但未在用户代码中处理
附加信息:无法引用实体对象 IEntityChangeTracker的多个实例。
并且没有内部异常。
答案 0 :(得分: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)然后我将新主键传递给此方法