我正在尝试创建一组我们实际上不删除它们的表,而是设置归档标志。当我们删除实体时,不应删除它,而应将其标记为已存档。
支持此功能的编程模式是什么?
如果有另一个解决方案,我也不想为每个拥有这些存档标志的表推出自己的存储过程。
答案 0 :(得分:1)
myEntity.IsArchived = true;
context.SaveChanges();
如果您的要求不删除,则不要删除; - )
答案 1 :(得分:1)
这是一个老问题,它没有指定EntityFramework版本。对于较新版本,有一些很好的解决方案:
Entity Framework: Soft Deletes Are Easy
Soft Delete pattern for Entity Framework Code First
Entity Framework 5 Soft Delete
还有EF 6.1.1 +
的来源Highlights of Rowan Miller’s EF6/EF7 Talk at TechEd 2014
Entity Framework: Building Applications with Entity Framework 6
答案 2 :(得分:0)
您必须编写自己的逻辑来执行此操作,并避开这些实体上的“MarkForDeletion”方法。
您的逻辑需要采用提供的实体,以某种方式更改它以表示它现在已“存档”,然后将更改保存在上下文中。
然后,您需要确保从数据库中提取的任何代码都遵循这些表示存档记录的值。
为了简化,您可以创建与您的实体类匹配的部分类,因此他们尊重自定义界面。这样您就可以对接口进行编码,而不必使用反射来设置实体值。
如果您可以使用.NET 4.0,EF支持POCO,您可以使用适当的接口标记实体,这将减少您必须使用的文件数量。
答案 3 :(得分:0)
我不确定最佳做法,但您可以尝试编写自己的DeleteObject
方法并将其放入某种类中(EFHelper
是我用于这些类的类的名称种类的东西)。然后,不是调用ObjectContext.DeleteObject
,而是调用EFHelper.DeleteObject
,并在该方法中执行您需要做的任何自定义逻辑。如果您与命名这些归档标志属性的方式一致,则可以使用.NET的反射API来查找您正在“删除”的每个EntityObject的archive_flag属性并进行相应的设置。