多个DBML模型是类名的最佳实践

时间:2012-07-23 20:54:19

标签: asp.net-mvc asp.net-mvc-3 linq-to-sql naming-conventions

我们的一些应用程序使用以下示例中的多个数据库 - 每个数据库都在各自的DBML文件中。问题是,MVC按惯例将它们全部放在导致类名冲突的namespace AppName.Models中。

两个选项中的哪一个是更好的解决方法以及原因:

1。)将它们放在不同的命名空间中。为了让stylecop / resharper高兴,他们会进入他们自己的子文件夹:

  • /型号
    • /活
      • Live.dbml
      • LiveDataContext.cs
    • / CRM
      • Crm.dbml
      • CrmDataContext.cs

**但现在在代码中,它们的所有用途都必须是Live.CustomerCrm.Customer来区分对象。

编辑:这个的另一个主要缺点是,我没有看到使用Models文件夹中的子文件夹的专家的其他示例代码。最重要的是,为了保持Helper文件代码重用的相同命名 - 即使只使用一个数据库的应用程序也需要Models中的子文件夹,我当然不会看到人们在MVC中做的事情< / H3>

2.。)在一个或两个DBML设计器中使用前缀添加所有对象名称。这是我目前的做法。 Live数据库包含CustomerOrder个对象,而Crm数据库包含CrmCustomerCrmOrder。它们都保留在同一名称空间和/Models文件夹中。然而,这有两个主要缺点:

  • 访问子对象时有相当多的前缀冗余:CrmCustomer.CrmOrders.First().CrmOrderType Marsha Marsha Marsha
  • 在仅使用一个数据库的其他应用程序中,我们经常省略前缀 - 然后在代码重用或Helper文件中,我们必须进行大量的查找/替换。这在Helper文件中尤其明显,这些文件会添加到每个应用程序中,例如错误/活动日志记录。

所以我想听听其他专家他们使用的两种策略中的哪一种,或完全不同的东西。在数据库之间至少存在一些名称冲突似乎很常见。感谢


示例表名称:

实时数据库:

  • 客户
  • 顺序
  • 地址
  • 电话
  • 日志
  • 其他20张表

Intranet数据库:

  • 客户
  • 顺序
  • 地址
  • 电话
  • 日志
  • 其他20张表

CRM工具数据库:

  • 客户
  • 顺序
  • 地址
  • 电话
  • 日志
  • 其他400张表

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您还有两种可能的解决方案:

  1. 您可以修改DBML生成的实体的命名空间。假设您使用T4模板生成它们,您可以右键单击* .tt文件,然后转到属性。有一个名称空间属性,您可以将其设置为您自己的自定义名称空间:

    • MyCompany.MyProject.DataModels.Live
    • MyCompany.MyProject.DataModels.Intranet
    • MyCompany.MyProject.DataModels.CRM
  2. 第二个类似的选项是让每个dbml和生成的类包含在它们自己的项目中,以及它们自己的命名空间。所以在这种情况下,您将有三个新项目:

    • Data.Live
    • Data.Intranet
    • Data.CRM

    然后,您希望在使用它们时添加对项目的引用。

    在我看来,这样做的好处是,明天你很可能有一个项目需要引用Live,CRM和一个全新的数据库。在这种情况下,您只需依赖于您已经创建的项目(二进制文件或代码 - 我的首选项是二进制文件,但是YMMV),并且第二个项目的该部分已完成。

  3. 在我看来,不要装饰你的课程(你的选择2)。这将很难维持。 您的选项1没有任何内在错误,我也已经这样做了,但对于我目前的大多数解决方案,我都会为可重用性因素创建项目。

答案 1 :(得分:0)

因此,我质疑导致您在代码中需要两个相同数据库的设计。除此之外,我认为选项1更好。这是我的理由:

  1. 代码更可重用。如果您需要将任一模型分离到另一个项目中,或者删除一个项目,则不必在任何地方删除前缀。这提供了清洁的分离。
  2. 选项2也要求您指定,您没有避免这种情况。但是,如果任何类只需要访问一个名称空间,则只需要在using级别指定,而不是在每个单独的代码引用中指定。在需要两者的类中,在任何一种情况下都不会避免使用前缀。所以选项#1在唯一重要的情况下胜出。
  3. 我通常会避免使用类型前缀。他们很难看。
  4. 抱怨,发牢骚,数据库设计