实体框架中的一般删除
本文关键字:删除 框架 实体 | 更新日期: 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))