【问题标题】:ASP.NET MVC (MVC2) Best practices when Inserting/Updating Data using Linq to SQL and Repository layersASP.NET MVC (MVC2) 使用 Linq to SQL 和存储库层插入/更新数据时的最佳实践
【发布时间】:2010-06-23 21:24:09
【问题描述】:

我在这里有点困惑,我希望你们中的一些大师能帮助填补空白。

我目前面临的情况是关于我的“用户”表和“OpenID”表。我的应用允许用户拥有多个 OpenID,因此我在单独的表中跟踪它们。

用户
身份证
用户名

OpenID
身份证
用户ID
声明的标识符

我为每个表都有一个 CRUD 存储库,并且我还有一个与存储库接口的服务(每个存储库一个服务)。

我的问题是关于插入新用户(因为更新将遵循相同的原则)。以下是我脑海中的选项。

  1. 让 UserService 插入新用户,检索用户 ID,然后使用 UserID 插入新 OpenID
  2. 让 UserService 将新用户连同 ClaimedIdentifier 一起发送到 UserRepository,并让存储库同时插入 User 和 OpenID(这不太适合 CRUD 方法)
  3. 创建 User 表和 OpenID 表的视图,创建 UsersOpenIDRepository 和 UsersOpenIDService,然后插入到视图中。

任何超出我能想到的其他想法或建议将不胜感激。

请注意,我没有使用 NHibernate,因此我可以对我的域进行建模,但我认为合适。我在这个项目上坚持使用 Linq to SQL,

【问题讨论】:

    标签: asp.net-mvc linq-to-sql repository-pattern crud service-layer


    【解决方案1】:

    根据我的经验,Linq2SQL 无论如何都不太适合 CRUD 方法。让它合身意味着要跳过太多的圈子,而不是真正值得。您所描述的问题甚至不是唯一的一个 - 在更新实体时它会变得更糟。

    因此,我在当前项目中选择了解决方案 2(在用户存储库中插入两个实体)。

    我也放弃了存储库的更新方法。相反,我的存储库只有一个 SubmitChanges 方法,必须在对加载的实体执行所有更新后调用该方法。在同一个 Web 请求中创建的所有存储库共享相同的 DataContext,因此我在哪个存储库上调用 Submitchanges 并不重要。它不是 CRUD,但它更适合 LINQ2SQL 执行数据库更新的方式。

    如果您真的绝对想要纯 CRUD,您可能需要使用 POCO 实体生成模板检查 EF。

    【讨论】:

    • 所以在这种插入上两次访问数据库不是世界末日吗?我担心有太多的数据库命中。此外,我并不完全赞同转向 EF、NHibernate 或任何类似的东西......这只是一个学习曲线。
    • 这当然不是世界末日。如果我没记错的话,Linq2SQL 会将这种插入转换为两个插入和一个选择以从数据库中获取 id。关于 EF:我也没有被卖掉。那是在花了 1 周时间评估 EF 之后。 Linq2SQL 更容易使用。如果它不是一种垂死的技术就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2010-10-10
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多