2012-03-11 12 views
5

Escribí una aplicación .net mvc 3 simple en VS2010 utilizando el primer acercamiento del código para generar el esquema. Cuando me haya desplegado en un servidor de producción compartida tengo el siguiente error: [SqlException (0x80131904):. Permiso CREATE BASE DE DATOS negado en el 'maestro' de base de datos]Implementación de las primeras aplicaciones del código EF en la base de datos de producción

Aquí está mi código de modelo:

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

aquí es mi código del controlador:

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

    } 

y aquí está mi cadena de conexión para la base de datos de producción

<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> 

Soy nuevo en asp.net mvc - por favor, avísenme cómo ejecutar mi aplicación contra una base de datos basada en producción donde no puedo ejecutar sql create o drop.

Gracias!

+2

Tenga en cuenta que ha publicado la contraseña para el archivo db en la configuración. Creo que deberías cambiar tu contraseña ... –

Respuesta

1

El problema aquí no parece necesariamente ser su código.

CREATE DATABASE permission denied in database 'master'

El mensaje de error anterior sugiere que el problema es su conexión a la base de datos con credenciales que no tienen la capacidad de crear nuevos elementos. Intente cambiar las credenciales para la creación o actualización inicial de las capacidades de la cuenta con la que se conecta

+0

Cierto, pero creo que el truco es que está tratando de conectarse a la base de datos errónea por completo. A partir de la lectura, puede tener la seguridad configurada correctamente y puede estar utilizando localhost en la aplicación.config, pero el sistema parece querer intentar y crear la base de datos en SQLEXPRESS ... que no está configurada en absoluto. – beauXjames

5

En un entorno compartido creo que es correcto hacer que cada aplicación solo tenga acceso a su propia base de datos y no pueda crear un base de datos. Consulte con el proveedor del entorno compartido cómo lo hace para obtener una nueva base de datos en funcionamiento. Una opción fácil para que se inicialice correctamente es enviar una copia de seguridad de la base de datos al administrador del servidor y pedir que se restaure la copia de seguridad.

Código EF Primero/Las migraciones pueden realizarse para no crear automáticamente o migrar automáticamente bases de datos cuando se ejecutan en un entorno de producción a través de 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."); 
     } 
    } 
    } 
} 

Habilitar con un constructor estático en su DbContext:

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

Gracias Andres: ¿cómo se vería el inicializador db personalizado en mi código? – user1261952

+0

El que he vinculado (pegado anteriormente también) debería funcionar como está. –

+0

no funcionó Andrés - lo siento por ser un dolor. ¿Tienes 5 minutos para iniciar sesión en Skype o Gmail? Puedo compartir mi pantalla con usted, de esa manera tendrá la oportunidad de ver mis otras configuraciones también. Podría estar haciendo algo estúpido en otra parte de la aplicación. Gracias. – user1261952

2

Usted no tiene privilegios de administrador en el espacio en el servidor SQL de su empresa de alojamiento. La razón por la que puede caer, pero fallará cuando EF intente el paso CREAR BASE DE DATOS. Las inicializaciones de bases de datos no se realizan mejor en aplicaciones de producción.

  1. Si tiene acceso y realiza su desarrollo en un servidor SQL de escala completa (no expreso). Simplemente haga una copia de seguridad, cárguelo y restaure en su espacio de servidor SQL de alojamiento.

  2. Si ha utilizado SQLExpress, debe generar el script SQL de cada objeto en sus datos y ejecutarlo en el espacio del servidor SQL de alojamiento. Opcionalmente, si puede recrear su base de datos en un servidor SQL de escala completa que le ahorraría la tarea de generar y ejecutar scripts.

  3. Comenta las partes de inicialización de la base de datos de tu código.

  4. Despliegue su código fuente en su espacio de alojamiento.
  5. Modifique la cadena de conexión para que apunte a la copia de la base de datos en el servidor SQL de su servidor.
  6. Ore para que todo funcione sin problemas. :) De lo contrario, considere la idea de que una vez que ejecuta la aplicación, acaba de ganarse un cinturón blanco en la implementación del proyecto WebAPI/EF.
Cuestiones relacionadas