我正在开发一个在Azure上运行的Web应用程序,该应用程序必须为每个新用户注册创建一个数据库。
在控制器的Register()方法中,启动CreateOrUpdateToElasticPoolAsync()方法以运行在弹性池中创建新数据库的API调用。 然后,使用Initialize()方法,许多方法使用样本数据填充新数据库。
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var response = await AzureRestAPISqlDatabase.Databases.CreateOrUpdateToElasticPoolAsync("databaseName", "elasticPoolName");
var databaseEF = new BO.DatabaseEF();
databaseEF.Inizialize();
return RedirectToAction(response.StatusCode == HttpStatusCode.Accepted ? "InfoConfirmEmail" : "Error");
}
AddErrors(result);
}
return View(model);
}
Inizialize()中包含的方法示例如下:
class Cliente
{
public static void Add()
{
var db = new DAL.Context(new BO.Account().ConnectionString);
var cliente = new Models.Cliente
{
DataModifica = DateTime.Now,
Sistema = true,
Tipo = Models.ContattoTipo.Cliente
};
cliente.Sede.Destinatario = "(nessuno)";
cliente.Destinazione.Destinatario = "(nessuno)";
db.Clienti.Add(cliente);
db.SaveChanges();
}
}
Cliente类的Add()方法创建Context类 传递类似于以下内容的connectionString参数:
"Server=tcp:XXXXXXXX.database.xxxxxx.xxx,XXXX;Initial Catalog=XXXX;Persist Security Info=False;User ID=XXXXX;Password=XXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
虽然Context类的构造函数的代码如下:
public partial class Context : DbContext
{
public Context(string connectionString) : base(connectionString)
{
Configuration.ProxyCreationEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public virtual DbSet<Cliente> Clienti { get; set; }
}
现在,如果我在远程调试配置中运行应用程序并在Cliente类的Add()方法中设置断点,运行F10直到方法结束,一切正常,没有错误。 如果,即使在远程调试配置中,也没有设置中断,我会收到以下错误:
Server Error in '/' Application.
Database 'b6eaae45-8aa6-43ef-9de0-f8d22701e8f0' already exists. Choose a different database name.
即使我在发布配置中运行应用程序,也会出现相同的错误。
我哪里错了?
提前致谢。
答案 0 :(得分:0)
在查看您提供的说明之后,以及以下几点......
现在,如果我在远程调试配置中运行应用程序并在Cliente类的Add()方法中设置断点,运行F10直到方法结束,一切正常,没有错误。如果,即使在远程调试配置中,也没有设置中断,我会收到以下错误:
我从未尝试为每个用户创建一个新数据库(我一直在考虑这样一个应用程序的巨大成本),但是,我已经在代码上创建了新的数据库。如果它在单独执行F10时有效,那么,作为错误,则可能是您正在调用数据库创建两次(如双重调用)。
这是我想象中发生的事情。
我的解决方案是,在Register方法中,我首先检查是否存在具有这样名称的数据库,并且只有在存在时才进行。至少这应该可以帮助您避免上述错误。