【问题标题】:Designing an append-only data access layer with LINQ to SQL使用 LINQ to SQL 设计仅附加数据访问层
【发布时间】:2011-03-06 14:50:56
【问题描述】:

我想到了一个应用程序,它表明数据库表只能追加;也就是说,我只能将数据插入数据库,而不能更新或删除它。我想使用 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),结果是未定义”。

这是傻事吗?我是否让自己变得比我需要的更难?

【问题讨论】:

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


    【解决方案1】:

    您有多个选择 - 您可以:

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

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

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

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

    【讨论】:

    • (a) 是我需要的技巧。在我的 SubmitChanges 中,我将枚举更新和删除并进行适当的翻译,然后调用 this.Refresh() 或 InsertOnSubmit() 来取消插入。谢谢!
    • Hrm... 在玩过之后,我认为 (c) 是更好的选择,所以我不需要为每个类添加“删除尝试失败”基础设施。没关系,你还是给了我正确的答案。
    【解决方案2】:

    如果您想要一个大型企业质量解决方案,您可以将其放入数据库中 - b) 从上面或 CRUD 程序

    如果这是一家小商店,没有很多其他开发人员或团队,或者数据价值极小,以至于第二个或第三个应用程序尝试访问数据不太可能会坚持使用任何漂浮的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-30
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多