【问题标题】:Deploying EF Code First Apps to Production Database将 EF Code First 应用程序部署到生产数据库
【发布时间】:2012-03-11 07:22:59
【问题描述】:

我使用代码优先方法在 VS2010 上编写了一个简单的 .net mvc 3 应用程序来生成架构。当我将它部署到共享生产服务器时,出现以下错误:[SqlException (0x80131904): CREATE DATABASE permission denied in database 'master'.]

这是我的型号代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace Bonappetit.Models
{
public class MenuItem
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
}

public class MenuItemDBContext : DbContext
{
    public DbSet<MenuItem> MenuItems { get; set; }
}
}

这是我的控制器代码:

 namespace Bonappetit.Controllers
{ 
public class MenuItemsController : Controller
{
    private MenuItemDBContext db = new MenuItemDBContext();

    //
    // GET: /MenuItems/

    public ViewResult Index()
    {
        return View(db.MenuItems.ToList());
    }

    public ActionResult generateJSON()
    {
        return Json(db.MenuItems.ToList(), JsonRequestBehavior.AllowGet);

    }

这是我的生产数据库连接字符串

 <connectionStrings>
  <add name="MenuItemDBContext" 
     connectionString="Data Source=localhost\sqlexpress;Initial Catalog=ptafhksz_bonappetit;User ID=ptafhksz_jalal;Password=345d654654Dfdgdfg" 
     providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>

我是 asp.net mvc 的新手 - 请告诉我如何在无法运行 sql create 或 drop 的基于生产的数据库上运行我的应用程序。

谢谢!

【问题讨论】:

  • 请注意,您已将密码发布到配置中的数据库。我认为您应该更改密码...

标签: c# .net entity-framework ef-code-first


【解决方案1】:

在共享环境中,我认为让每个应用程序只能访问自己的数据库而不能创建数据库是正确的。请与共享环境的供应商核实您如何启动和运行新数据库。正确初始化它的一个简单选择是将数据库的备份发送给服务器的管理员并要求恢复备份。

通过custom db initializer strategy 在生产环境中运行时,可以进行EF Code First / 迁移以不自动创建或自动迁移数据库。

public class ValidateDatabase<TContext> : IDatabaseInitializer<TContext>
  where TContext : DbContext
{
  public void InitializeDatabase(TContext context)
  {
    if (!context.Database.Exists())
    {
      throw new ConfigurationException(
        "Database does not exist");
    }
    else
    {
      if (!context.Database.CompatibleWithModel(true))
      {
        throw new InvalidOperationException(
          "The database is not compatible with the entity model.");
      }
    }
  }
}

使用 DbContext 中的静态构造函数启用它:

static MyDbContext()
{
    Database.SetInitializer(new ValidateDatabase<CarsContext>());
}

【讨论】:

  • 谢谢 Andres - 我的代码中的自定义数据库初始化器是什么样子的?
  • 我链接到的那个(也粘贴在上面)应该可以正常工作。
  • 它不起作用安德烈斯 - 很抱歉让您感到痛苦。你有 5 分钟登录 Skype 或 gmail 吗?我可以与您共享我的屏幕 - 这样您也将有机会查看我的其他设置。我可能在应用程序的另一部分做一些愚蠢的事情。谢谢。
  • 初始化器将阻止您的代码尝试创建数据库。在运行代码之前您是否正确创建了数据库?
  • 嗨安迪 - 我试过你的代码,但我仍然有同样的问题。这是堆栈跟踪:ibonappetit.co.uk/MenuItems。也许这会让你更好地了解问题所在。再次感谢您的时间
【解决方案2】:

您对托管公司的 SQL 服务器空间没有管理员权限。当 EF 尝试 CREATE DATABASE 步骤时,您可能能够删除但会失败的原因。最好不要在生产应用上进行数据库初始化。

  1. 如果您可以访问并在完整的 SQL Server(不是 express)上完成您的开发。只需在您的托管 SQL 服务器空间上进行备份、上传和恢复即可。

  2. 如果您使用过 SQLExpress,则必须为数据上的每个对象生成 SQL 脚本,并在托管 SQL 服务器空间上运行它。或者,如果您可以在完整的 SQL Server 上重新创建数据库,这将节省您生成和执行脚本的任务。

  3. 注释掉代码的数据库初始化部分。

  4. 将您的源代码部署到您的托管空间。
  5. 修改连接字符串以指向主机 SQL 服务器上的数据库副本。
  6. 祈祷一切顺利。 :) 如果没有,请考虑一下,一旦您运行应用程序,您就为自己赢得了 WebAPI/EF 项目部署的白带。

【讨论】:

    【解决方案3】:

    这里的问题不一定是您的代码。

    数据库“master”中的 CREATE DATABASE 权限被拒绝

    上面的错误消息表明问题在于您使用无法创建新项目的凭据连接到数据库。尝试更改初始创建的凭据或升级您正在连接的帐户的功能

    【讨论】:

    • 没错,但我认为诀窍在于它试图完全连接到错误的数据库。从阅读中,您可能已经正确设置了安全性,并且您可能在 app.config 中使用了 localhost,但系统似乎想尝试在 SQLEXPRESS 中创建数据库......根本没有配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多