使用LINQ to SQL设计仅附加数据访问层

时间:2010-06-22 02:49:11

标签: sql linq linq-to-sql database-design

我有一个应用程序,它指出数据库表只能追加;也就是说,我只能将数据插入数据库,但永远不会更新或删除它。我想使用LINQ to SQL来构建它。

由于表是仅附加的,但我仍然需要能够“删除”数据,我的想法是每个表Foo都需要有一个相应的FooDeletion表。 FooDeletion表包含引用已删除的Foo的外键。例如,下表描述了状态“存在Foos 1,2和3,但Foo 2和Foo 3已被删除”。

Foo      FooDeletion
id       id  fooid
----    -------------
1        1   2
2        2   3
3

虽然我可以在数据访问层之上构建一个抽象,它(a)阻止直接访问LINQ to SQL实体,(b)以这种方式管理删除,我的目标之一是将我的数据访问层保持为尽可能地减薄,所以我更愿意让DataContext或实体类在幕后完成工作。所以,我想让调用者像正常一样使用Table<Foo>.DeleteOnSubmit(),DAL知道要向FooDeletion添加一行,而不是从Foo删除一行。

我已阅读"Implementing Business Logic""Customizing the Insert, Update, and Delete Behavior of Entity Classes",但我无法找到实现我想要的具体方法。我以为我可以使用部分方法DataContext.DeleteFoo()代替调用ExecuteDynamicInsert(FooDeletion),但是根据this article,“如果调用了一个不适用的方法(例如,对于要更新的​​对象的ExecuteDynamicDelete) ,结果未定义“。

这是一个傻瓜的差事吗?我对自己这么做比我需要的更难吗?

2 个答案:

答案 0 :(得分:4)

您有多个选项 - 您可以:

a)覆盖SubmitChanges,获取更改集(GetChangeSet())并将更新和删除转换为插入。

b)使用替代触发器db-side来更改更新/删除行为。

c)向Table添加一个新的Delete扩展方法,以实现您想要的行为。

d)......或根据需要结合+ b + c ......

答案 1 :(得分:1)

如果你想要一个大男孩企业质量的解决方案,你可以把它放在数据库中 - 或者b)来自上面或CRUD程序&lt; - 我的偏好...触发器是邪恶的。

如果这是一个小商店,而不是很多其他开发人员或团队,或者是价值最低的数据,那么试图访问数据的第二个或第三个应用程序不可能坚持使用你的船上的任何东西。