【发布时间】:2013-03-28 17:20:36
【问题描述】:
我有一个包含此方法的通用存储库:
public void Delete<T>(T item) where T : EntityBase
我正在尝试向某些对象添加软删除行为; IE。删除时,它们不会从数据库中删除,而是将 bool Deleted 设置为 false 并且它们停止出现在查询中,除非将特定参数设置为包含它们。一般来说,应用程序的行为就好像它们不存在一样,除了管理视图,这些项目可以通过再次翻转该布尔值来恢复。我的问题是,在将对象传递给此方法时,它被处理为EntityBase,它没有这种软删除行为,因为许多类不需要它。 SoftDeleteEntityBase 扩展了 EntityBase 类以添加软删除行为,但我找不到一种干净的方法来转换对象以便我可以得到布尔值。我的第一个想法是:
public void Delete<T>(T item) where T : EntityBase
{
if (item is SoftDeleteEntityBase)
{
((SoftDeleteEntityBase)item).Deleted = true;
Update<T>(item);
}
else
{
db.Set<T>().Remove(item);
}
}
但这给了我错误"Cannot convert type T to SoftDeleteEntityBase"。
我如何得到那个布尔值?
【问题讨论】:
-
(项目为 SoftDeleteEntityBase).Deleted = true;
-
@JohnLiu 可能
NullReferenceException -
感谢 llya,假设在函数开始时进行检查。不是这个声明。
-
@JohnLiu 实际上......是的,换掉那条线是可行的。我不太清楚我是如何记得我可以在支票中使用
is,但忘记了我可以在转换中使用as。如果您想将其发布为答案,我会接受。 -
没关系,谢谢。我建议您考虑如何处理软删除。看起来您正在将业务逻辑隐藏到基础架构组件中。
标签: c# entity-framework inheritance polymorphism