我用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
...
除数据库外,一切都是分开的。
我们的想法是将所有生产数据库放在一个地方,以便于备份和其他维护,以及价格。
我希望这更有意义:)
答案 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子句将阻止每个客户端查看其他客户端的数据。您没有每个客户端呈指数级增长的表结构,维护更简单。
除了这些好处,你还可以获得另一个好处。现在创建跨越所有客户的报告非常简单,以防您出于管理目的而需要它们。