实体框架中的一般删除

本文关键字:删除 框架 实体 | 更新日期: 2023-09-27 18:33:27

我有一个通用的删除方法DoDelete<MyTable>(int batchSize, MyDatabaseContext)

此方法将id(List<int> deleteId)建立到批处理大小计数,然后我喜欢调用

BulkDelete<T>(MyDatabaseContext, t => deleteId.Contains(t.RecordId)) 

但是,这种方法不起作用,因为它不知道<t>具有属性RecordId(即使它始终是RecordId属性)。

我也尝试过:

int rows = BulkDelete<T>(MyDatabaseContext, "RecordId in (100001,100002)");

这是执行删除的实际方法,我还有一个接受字符串谓词的重载。

public int BulkDelete<T>(MyDatabaseContext context, Expression<Func<T,   bool>> predicate)
where T : class
{
    int rows = context.Set<T>().Where(predicate).Delete();
    return rows;
}

实体框架中的一般删除

正如@mason所说,您可以使用所有实体实现的 RecordId 属性创建一个接口,然后您的泛型t=>deleteId.Contains(t.RecordId)将编译:

// The interface
public interface IRecordIdEntity
{
    int RecordId {get;set;}
}
// Sample Class
public class Person : IRecordIdEntity
{
   // implement the interface
   public int RecordId {get;set;} 
}
// Generic BulkDelete for IRecordIdEntitys
public int BulkDelete<T>(MyDatabaseContext context, Expression<Func<T, bool>> predicate)
    where T : IRecordIdEntity
{
    int rows = context.Set<T>().Where(predicate).Delete();
    return rows;
}
// Sample call
BulkDelete<Person>(MyDatabaseContext, person=> deleteId.Contains(person.RecordId)) 

现在BulkDelete()仅限于处理实现IRecordIdEntity的类型,谓词始终有效。

首先,您应该使用接口来处理:

public interface IEntity
{
    long RecordId { get; set; }
}

然后,您应该这样做,以便所有其他实体对象(表)实现该接口:

//Example
public class Book : IEntity
{
    public long RecordId { get; set; }
    public string Name { get; set; }
    public string Author{ get; set; }
}

之后,您可以轻松地向方法添加约束:

    public int BulkDelete<T>(MyDatabaseContext context, Expression<Func<T, bool>> predicate)
        where T : class, IEntity
    {
        int rows = context.Set<T>()
            .Where(predicate).Delete();
        return rows;
    }

在那之后,这个电话会很好,因为t IEntity

BulkDelete<T>(MyDatabaseContext, t=>deleteId.Contains(t.RecordId))