【问题标题】:Azure app - Different behavior between release configuration and remote debug configurationAzure 应用程序 - 发布配置和远程调试配置之间的不同行为
【发布时间】:2018-02-01 04:14:20
【问题描述】:

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

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

我哪里错了?

提前致谢。

【问题讨论】:

  • 由于它们共享相同的连接字符串,它将始终创建相同的数据库。
  • 对不起,我不明白。谁共享相同的连接?
  • 你试图解决的方法行不通。这种在不存在时创建的方法是模型优先方法。
  • 感谢您的回复。我不知道从哪里开始研究这个解决方案。
  • 为每个用户创建一个新数据库?我只是想知道,你为什么想要那个......也许你只是想为用户创建一个新的......我想确定你真的在尝试为每个用户创建一个新的数据库。

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


【解决方案1】:

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

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

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

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

  1. 您调用数据库创建(注册)。数据库被创建。
  2. 然后,您再次调用 Register,并尝试创建相同的数据库。遇到这个错误。在这第二步中,可能由于某些错误机制,发生了对 Azure 的第二次调用,这迫使代码再次使用相同的名称创建数据库。

我的解决方案是,在注册方法中,我会首先检查是否存在具有此类名称的数据库,如果存在则继续。至少这应该可以帮助您避免上述错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2011-08-31
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多