我有两个表,如下例所示,在MSSQL数据库中。
PROJECT
id
startDate
endDate
STORY
id
project_id
description
deleted_flag
在我的应用程序的逻辑中,我不希望用户能够真正“删除”一个对象,但我想给他们这种幻觉。因此,一旦故事被删除,“deleted_flag”将设置为true。
这一切都很好,但是当使用LINQ to SQL时,我遇到了与设计模式相关的问题。
我使用存储库模式,在我的存储库中,我的“FindAll()”方法包含过滤器Where(s =>!s.deleted_flag),以便当用户检索到Story列表时,它只显示未删除的。
我遇到的问题是在整个系统中强制执行此问题=问题是由于LINQ中父对象的可访问性,可以通过简单地使用
来获取未过滤的集合Event e = EventsRepository.FindWithID(1);
var stories = e.Storys;
这将允许调用者甚至查看已删除的对象。
处理此问题的推荐方法是什么?
AK
答案 0 :(得分:3)
创建一个与表几乎相同的行模式,但包括Where子句:
Create View vwStory
AS
SELECT id, project_id, description, deleted_flag
WHERE deleted_flag = 0
更改故事类的[Table]
属性,以便它使用该视图而不是表格。
向视图添加INSTEAD OF
个触发器,以便插入和更新传递到表中(您甚至可以使删除设置标志而不是删除行)。
Linq会将其视为与表相同,具有适当的select,update,insert和delete查询,但数据库将根据此视图的定义执行它们。
答案 1 :(得分:1)
您基本上有两种选择来强制执行该约束:
不要直接查询表,而是使用过滤了数据库端已删除行的视图。这样做的缺点是你的应用程序没有机会检索标记的记录(即从管理界面)。
不要通过删除L2Smodel中的关联来使用L2S生成的导航属性。该方法的缺点是,您必须通过存储库显式查询相关对象。