Azure应用程序 - 发布配置和远程调试配置之间的不同行为

时间:2017-08-23 14:03:46

标签: c# asp.net-mvc entity-framework azure remote-debugging

我正在开发一个在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.

即使我在发布配置中运行应用程序,也会出现相同的错误。

我哪里错了?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在查看您提供的说明之后,以及以下几点......

现在,如果我在远程调试配置中运行应用程序并在Cliente类的Add()方法中设置断点,运行F10直到方法结束,一切正常,没有错误。如果,即使在远程调试配置中,也没有设置中断,我会收到以下错误:

我从未尝试为每个用户创建一个新数据库(我一直在考虑这样一个应用程序的巨大成本),但是,我已经在代码上创建了新的数据库。如果它在单独执行F10时有效,那么,作为错误,则可能是您正在调用数据库创建两次(如双重调用)。

这是我想象中发生的事情。

  1. 您调用数据库创建(注册)。数据库已创建。
  2. 然后,您再次调用Register,并尝试创建相同的数据库。遇到这个错误。在第二步中,可能是由于某种错误机制,对Azure发生了第二次调用,这迫使代码再次使用相同的名称创建数据库。
  3. 我的解决方案是,在Register方法中,我首先检查是否存在具有这样名称的数据库,并且只有在存在时才进行。至少这应该可以帮助您避免上述错误。