在MVC中删除包含复合主键的记录

时间:2015-12-17 14:31:34

标签: c# entity-framework datacontext

我的控制器中有一个方法,如果用户单击一个按钮,它将订阅它们或者如果订阅已经订阅则将它们从订阅中删除。它通过将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的多个实例。

并且没有内部异常。

1 个答案:

答案 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)然后我将新主键传递给此方法