繁体   English   中英

实体框架中的通用删除

[英]Generic Delete in Entity Framework

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

此方法将 ids ( 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;
    }

之后这个调用会很好,因为tIEntity

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM