2016-03-30 4 views
1

Я делаю веб-приложение, которое будет использоваться несколькими компаниями, и я хочу, чтобы каждый из них имел отдельную базу данных.ASP .Net Entity Framework одна база данных для пользователя

На экране входа в систему пользователь выберет компанию, и он перейдет в отдельную базу данных, чтобы получить данные строки соединения. Приложение сначала использует код, поэтому база данных будет создана с помощью этой новой строки соединения, если она еще не существует.

Мой подход состоял в том, чтобы сохранить строку соединения в сеансе пользователя.

public MyContext() : base(MySession.Current.ConnectionString) 
{ 
    Database.SetInitializer(new MyDevDbInitializer());  
} 

Я сделал строку подключения по умолчанию для возврата в случае, если она не может получить сеанс. Кажется, что это работает, но я могу видеть, что он по умолчанию используется несколько раз для каждого запроса, прежде чем получить сохраненный. Но создание базы данных и операции CRUD работают нормально.

Я не знаю, правильно ли я делаю это, и если другой запрос сделан (я полагаю, что они есть), эти запросы выполняются изнутри, я не могу их проследить.

Извините за длинный текст. :)

+2

Я бы посоветовал вам не создавать базу данных автоматически. У меня был бы один контекст для приложения, ответственный переход к основной базе данных, а затем другой для доступа пользователя, который просто соединяется с использованием существующей базы данных. Затем вы или ваша команда инфраструктуры должны создать базу данных вручную для пользователя при создании учетной записи. Честно говоря, пугающе иметь веб-приложение, создающее базы данных «на лету», так или иначе, но вам также нужно будет предоставить пользователю SQL соединение с полными разрешениями на экземпляр, что представляет большой риск для безопасности. –

+0

В дополнение к тому, что написал @Chris Pratt, подумайте о том, чтобы сделать слой доступа к данным настолько плотным с помощью ASP-базы (MySession.Current.ConnectionString). У вас нет контроля над созданием или отсутствием контекста с неправильной строкой соединения. Кроме того, вы не сможете писать модульные тесты. – bubi

+1

* одна база данных на пользователя * звучит так, будто вам нужно серьезно пересмотреть общую архитектуру. Это звучит как ужасно плохой дизайн .... –

ответ

0

На мой взгляд, это полезно использовать 1 базу данных для каждой компании. А для пользователя вам нужно создать таблицу, которая хранит всю информацию для всех пользователей, она может быть достаточно большой, не имеет значения. Я предлагаю использовать 1 объект для нескольких баз данных: http://olivierhelin.com/blog/entity-framework/entity-framework-6-one-entity-data-model-multiple-databases-2

Надеюсь, эта помощь.

+0

Спасибо за помощь :) Это значит, что тогда у меня будут пользователи в разных базах данных. Я хотел бы все это вместе модульным способом. В любом случае, если это будет возможно, можно было бы сначала использовать этот код? – Dothos

Смежные вопросы