将EF Code First应用程序部署到生产数据库

时间:2012-03-11 07:23:00

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

我使用代码优先方法在VS2010上编写了一个简单的.net mvc 3应用程序来生成模式。当我将它部署到共享生产服务器时,我收到以下错误:[SqlException(0x80131904):在数据库'master'中拒绝CREATE DATABASE权限。]

这是我的型号代码:

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。

谢谢!

3 个答案:

答案 0 :(得分:5)

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

EF代码优先/迁移可以通过custom db initializer strategy在生产环境中运行时不自动创建或自动迁移数据库。

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>());
}

答案 1 :(得分:2)

您在托管公司的SQL服务器空间中没有管理员权限。您尝试CREATE DATABASE步骤时可能会丢弃但会失败的原因。数据库初始化最好不要在生产应用程序上完成。

  1. 如果您可以在全面的SQL Server(非快速)上访问并完成您的开发。只需进行备份,上传并在托管SQL服务器空间恢复。

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

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

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

答案 2 :(得分:1)

此处的问题似乎不一定是您的代码。

  

在数据库'master'

中拒绝CREATE DATABASE权限

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