0

我们的几个应用程序使用下面示例中的多个数据库 - 每个数据库都在各自单独的 DBML 文件中。问题是,按照惯例,MVC 将它们都放在了namespace AppName.Models导致类名冲突的地方。

这两个选项中哪一个是更好的解决方案,为什么:

1.) 将它们放在单独的命名空间中。为了让 stylecop/resharper 满意,他们会进入自己的子文件夹:

  • /楷模
    • /居住
      • Live.dbml
      • LiveDataContext.cs
    • /CRM
      • CRM.dbml
      • CrmDataContext.cs

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

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

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

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

所以我想听听其他专家的意见,他们使用了这两种策略中的哪一种,或者完全是别的什么。数据库之间至少有一些名称冲突似乎很常见。谢谢


示例表名:

实时数据库:

  • 顾客
  • 命令
  • 地址
  • 电话
  • 日志
  • 其他 20 张桌子

内网数据库:

  • 顾客
  • 命令
  • 地址
  • 电话
  • 日志
  • 其他 20 张桌子

CRM 工具数据库:

  • 顾客
  • 命令
  • 地址
  • 电话
  • 日志
  • 其他 400 张桌子
4

2 回答 2

1

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

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

    • MyCompany.MyProject.DataModels.Live
    • MyCompany.MyProject.DataModels.Intranet
    • MyCompany.MyProject.DataModels.CRM
  2. 第二个类似的选择是让每个 dbml 和生成的类包含在它们自己的项目中,并且它们自己的命名空间与之关联。因此,在这种情况下,您将拥有三个新项目:

    • 实时数据
    • 数据.Intranet
    • 数据.CRM

    然后,您可以在想要使用项目时添加对项目的引用。

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

在我看来,不要装饰你的班级(你的选择 2)。这将很难维持。您的选项 1 本质上没有任何问题,我也这样做了,但是对于我当前的大多数解决方案,我为可重用性因素创建项目。

于 2012-08-01T18:26:42.507 回答
0

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

  1. 代码更可重用。如果您需要将任一模型分离到另一个项目中,或删除一个,您不必在任何地方删除前缀。这提供了干净的分离。
  2. 选项 2 也需要您指定,您不能避免这一点。但是,如果任何类只需要访问一个命名空间,您只需在using级别上指定,而不是在对代码的每一个引用中指定。在需要两者的类中,无论哪种情况,您都不会避免使用前缀。所以选项#1 在唯一重要的情况下胜出。
  3. 我通常会避免使用类型前缀。他们很难看。
  4. 抱怨,抱怨,数据库设计
于 2012-07-23T23:25:12.370 回答