一个数据库,多个.NET MVC 5实例

时间:2015-01-18 16:47:36

标签: c# asp.net-mvc design-patterns database-design entity-framework-6

我用EF 6应用程序编写了c#ASP.NET MVC 5。我有2个客户。在他们每个人之前我需要稍微修改一下应用程序。

我不会让他们共享一个数据库,但使用单独的表名,我通过以下方式实现:

string dbPrefix = "Client1";    
modelBuilder.Entity<Request>().ToTable(dbPrefix + "_TableName);
...

这是可能的,还有更好的方法吗?

更新 让我试着用这种方式来解释。有一个应用程序有10个表,我上面的表名称购买方法。 应用程序的2个(或更多)版本(实例)应占用相同的数据库,但每个版本都有自己的表。他们之间没有分享。可能还有不同的应用程序。

App位于public / laf中,表前缀为laf

App位于public / perla中,表前缀为perla

...

除数据库外,一切都是分开的。

我们的想法是将所有生产数据库放在一个地方,以便于备份和其他维护,以及价格。

我希望这更有意义:)

1 个答案:

答案 0 :(得分:0)

您正在寻找的“更好的方法”是使用相同的表,但添加一个标识正在使用它的客户端的附加列。然后,您可以对应用程序进行编程,以便每个客户端只能查看和编辑自己的数据。

通常,您需要添加一个表来标识客户端:

|  ClientID  |  Name                    |
|------------|--------------------------|
|  1         |  Client 1                |
|  2         |  Client 2                |
|------------|--------------------------|

然后,您将在所有其他表中使用ClientID作为外键:

|  SomeTableID  |  ClientID                |   Other fields...
|---------------|--------------------------|
|  1            |  2                       |
|  2            |  1                       |
|---------------|--------------------------|

然后在所有查询中,您将ClientID添加到where子句:

// clientId is the currently logged on.
// Typically, this would be passed into your data access code
// from your business layer.
int clientId = 1;

var query = for someTable as Entities.SomeTable
    where (someTable.ClientID == clientId)
    select someTable

where子句将阻止每个客户端查看其他客户端的数据。您没有每个客户端呈指数级增长的表结构,维护更简单。

除了这些好处,你还可以获得另一个好处。现在创建跨越所有客户的报告非常简单,以防您出于管理目的而需要它们。