繁体   English   中英

如何使用 Net core 3 和 Entity Framework 由新客户端创建新数据库?

[英]How to create new database by new client with Net core 3 and Entity Framework?

我尝试使用 Net core 为 CRM 应用程序创建 API。问题是我不想为我的 CRM 的每个客户只使用一个大数据库。

  • 我有迁移来创建数据库
  • 我有一个很大的 ApplicationDBContext 和许多模型

我想要的是,对于每个订阅的新客户,我都会生成一个带有公司名称的新数据库,因此 APi 使用这个新公司的连接字符串和这个新数据库。 所有客户端使用相同的身份数据库进行订阅。

EntityFramework 和 .Net core 3 是否有可能,请问如何做到这一点? 谢谢:)

对的,这是可能的。 下面,我在.NetCore(3.0) web api 中创建了一个小示例。 这个想法是您必须在 HttpRequest header 中传递公司名称,然后在您的 DbContext class 中使用它。 通过这种方式,您将能够使用包含 controller 中的新公司名称的 connectionString 获取 DbContext 的实例,并使用新公司名称创建新数据库。

  1. 在 appsettings.json 中创建一个名为 sql 的部分,其中包含一个连接字符串。 不要指定数据库名称并在=符号后将其留空:

    "sql": { "connectionString": "Server=localhost;User ID=userId;Password=yourPass;Database=" }

  2. 创建一个 class SqlSettings用于保持连接字符串:

     public class SqlSettings { public string ConnectionString { get; set; } public void SetDbName(string companyName) { int index = ConnectionString.LastIndexOf("="); if (index > 0) ConnectionString = ConnectionString.Substring(0, index); ConnectionString = $"{ConnectionString}={companyName}"; } }
  3. CustomContext class,它使用依赖注入在其构造函数中获取必要的依赖关系并更改连接字符串:

     public class CustomContext: DbContext { public string CompanyName { get; private set; } private IOptions<SqlSettings> _sqlSettings; public CustomContext(DbContextOptions<CustomContext> options, IOptions<SqlSettings> sqlSettings, IHttpContextAccessor httpContextAccessor): base(options) { GetDbName(httpContextAccessor.HttpContext.Request); if (string.IsNullOrEmpty(CompanyName)) return; sqlSettings.Value.SetDbName(CompanyName); _sqlSettings = sqlSettings; } private void GetDbName(HttpRequest httpRequest) { try { CompanyName = httpRequest.Headers["CompanyName"]; } catch (Exception) { CompanyName = ""; } } public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(_sqlSettings.Value.ConnectionString); } }
  4. 在我们的CustomContext class 中,我们有一个名为Users的表,它被创建为一个测试用例:

     public class User { public Guid Id { get; set; } public string Email { get; set; } public string Password { get; set; } }
  5. Startup.cs class 的ConfigureServices方法中,我们需要注册我们的类,以便能够使用 DI 获取它们。

     public void ConfigureServices(IServiceCollection services) {...... services.AddHttpContextAccessor(); services.Configure<SqlSettings>(Configuration.GetSection("sql")); services.AddEntityFrameworkSqlServer().AddDbContext<CustomContext>(); }
  6. 现在,我们可以在任何Controller中使用我们的CustomContext class ,使用Action Method Injection将其作为Action's参数:

     [HttpGet()] public IActionResult Get([FromServices] CustomContext dbContext) { if (.string.IsNullOrEmpty(dbContext.CompanyName)) dbContext.Database;EnsureCreated(); return Ok(); }

因此,我们可以创建一个名为公司名称的新数据库,该数据库从每个HttpRequest's header 中提取。 此外,如果具有相同公司名称的数据库已经存在, Entity Framework将不会再次创建它。

我会这样做:

创建一个为您创建新数据库的存储过程,将新数据库名称和新客户/租户所需的任何其他信息作为输入参数。

然后在需要创建新数据库的第一点,让 EF 调用该存储过程,然后创建数据库。

另请参阅此处,因为您对如何使用新数据库名称的参数执行此操作感兴趣:

SQL 服务器:在 CREATE DATABASE 中使用参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM