shenghanis@yahoo.com Ответов: 1

Внедрение Saas в ASP.NET приложение MVC с использованием языка C#


Мы разработали ERP-приложение с использованием Visual Studio 2019, C# и ASP.NET MVC. Мы хотим перевести его на модель SaaS.

Мы использовали Entity Framework с подходом, основанным на данных. И большая часть нашего кода использует Linq для доступа к базе данных. Строка подключения к базе данных SQL Server указывается в файле web.config, который создается автоматически при создании EF.

Пример строки подключения в файле web.config:

<добавить имя="myEntities"
="" connectionstring="metadata=res://*/myEntities.csdl|res://*/myEntities.ssdl|res://*/myEntities.msl;provider=System.Data.SqlClient;строка подключения провайдера="источник данных=xx.xx.xx.xxx;начальная catalog=XXXcustomerdB;userid=sa;password=xxxpassword;MultipleActiveResultSets=True;App=EntityFramework"" providername="System.Data.EntityClient">


Чтобы разрешить доступ клиенту, мы создаем веб-сайт на IIS по порту, например 8112. веб-сайт создается в специальной папке под inetpub (например, C:\inetpub\customername).

Эта база данных клиентов (XXXcustomerdB) создается в SQL Server и указывается в файле web.config. Этот файл web.config также копируется в ту же папку

Теперь для другого клиента выполняется та же процедура (отдельный порт, папка и база данных).

Все базы данных, созданные таким образом, имеют одинаковую структуру базы данных и прекрасно работают с одним и тем же EF. Таким образом, для 10 клиентов у нас будет 10 папок и 10 различных портов

Перед нами стоят следующие задачи:

Поскольку мы используем LINQ, DbContext всегда привязан к соединению, указанному в web.config, что заставляет нас иметь отдельный web.config и, следовательно, отдельные папки для каждого клиента. Кроме того, для каждого клиента мы должны создавать и поддерживать ресурсы (папку, веб-сайт, порт IIS, конфигурацию и т.д.) По-разному и вручную.

Использование ADO.NET, мы могли бы создать строку подключения динамически и получить доступ к нескольким базам данных на основе логина пользователя, но LINQ не позволяет нам этого сделать. Мы находимся на той стадии, когда мы не можем бросить LINQ и перейти к ADO.NET.

Нам нужно решение, в котором нам не нужно создавать отдельную папку, веб-сайт или порт. Веб-сайт размещается просто в корневом каталоге и порту 80.

Логин пользователя будет авторизован из общей базы данных (которая может быть указана в файле web.config). Эта база данных будет содержать информацию об имени базы данных пользователя и других учетных данных.

Это позволит нам реализовать инфраструктуру SaaS.

Может ли кто-нибудь предложить нам решение? Заранее большое спасибо..

Что я уже пробовал:

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

1 Ответов

Рейтинг:
9

F-ES Sitecore

Когда вы создаете свой контекст БД;

using (db = new MyContext())
{
    var data = db.SomeTable.FirstOrDefault(x => x.ID = 1234);
}


Вы можете передать строку подключения в качестве параметра

string connName = "Customer-related connection name here";
using (db = new MyContext(connName))
{
    var data = db.SomeTable.FirstOrDefault(x => x.ID = 1234);
}


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


shenghanis@yahoo.com

Спасибо за быстрый ответ, но он не работает для меня, так как MyContext не принимает никаких параметров. Я попытался изменить MyContext.Context.cs, чтобы принять такие параметры, как,

public MyContext(строка connstring="")
: base("name=MyContext")
{
}

но это не сработало.

shenghanis@yahoo.com

Спасибо, дорогая, все решено..