0

我的问题是..

我会问我的用户,他是否要删除记录。如果他说是,

我不会真正从表中删除行,但会用 true 更新表的 Deleted 列。但在此之前,我想像在删除行案例中一样检查外键约束,这意味着该值是否被其他表使用。我应该说我的用户该行被其他表使用所以不能删除?

有什么想法我该怎么做。

目前我这样做是为了删除..

public bool Delete(dynamic entity)
{
    try
    {
        //here I want to check, whether this is being used by some other table or not. Foreign key constaint
        entity.Deleted = true;
        this.SaveChanges();
        return true;
    }
    catch { return false; }
}
4

3 回答 3

1

我的回答适用于实体框架 5.0 和 Code First。该解决方案需要两个部分。首先,您的每个数据类都必须实现一个公开“已删除”属性的接口(我们称之为 IVirtualDelete)。

public interface IVirtualDelete{
  bool Deleted {get; set;}
}

其次,您需要覆盖 DBContext 中的 SaveChanges 方法。

调用 SaveChanges 时,请查看 context.ChangeTracker.Entities() 以查找具有 System.Data.EntityState.Deleted 状态且实体实现您的 IVirtualDelete 接口的那些。在对象上设置 Deleted,并将实体状态更改为 Modified。

public override int SaveChanges() {
  foreach (var item in this.ChangeTracker.Entries().Where(x=> x.EntityState == EntityState.Deleted)){
    var entity = item.Entity as IVirtualDelete;
    if(entity != null){
      entity.Deleted = true;
      item.EntityState = EntityState.Modified;
    }
  }
  return base.SaveChanges();
}
于 2013-02-01T21:29:59.203 回答
0

这就是“关于它”。EF 没有方法将删除覆盖到更新中,最后可以说这不好,因为机制可能会有所不同(删除的时间戳等)。所以,你所做的就是人们在这种情况下所做的。

于 2012-12-30T21:39:15.123 回答
0

您可以尝试更改实体的主键值并保存。

如果存在任何子记录 - 您将收到某种级联更新错误并返回 false。

如果更新成功 - 您没有子记录,您可以将主键值更改回原始值,设置 Deleted = true 并重新保存。

当然,如果您将身份作为主键或有具有“删除级联”用户可见场景的子表,则这不适用。

于 2013-03-13T11:33:05.460 回答