2012-03-11 11 views
5

Ho scritto una semplice app .net mvc 3 su VS2010 utilizzando il primo approccio del codice per generare lo schema. Quando ho schierato a un server di produzione condiviso ho ottenuto il seguente errore: [SqlException (0x80131904):. Autorizzazione CREATE DATABASE negata nel database 'master']Distribuzione delle prime app del codice EF al database di produzione

Ecco il mio codice modello:

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

qui è il mio codice di controllo:

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

    } 

ed ecco la mia stringa di connessione per il database di produzione

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

Sono nuovo di asp.net mvc - per favore mi consigli come eseguire la mia app contro un DB basato sulla produzione in cui non posso eseguire sql create o drop.

Grazie!

+2

Si prega di notare che è stata inserita la password nel db nella config. Penso che dovresti cambiare la password ... –

risposta

1

Il problema qui non sembra necessariamente essere il tuo codice.

CREATE DATABASE permission denied in database 'master'

Il messaggio di errore di cui sopra suggerisce che il problema è la vostra connessione al database con le credenziali che non hanno la capacità di creare nuovi elementi. Prova a cambiare le credenziali per la creazione iniziale o l'aggiornamento delle funzionalità dell'account che stai connettendo con

+0

Vero, ma penso che il trucco sia che sta tentando di connettersi completamente al DB sbagliato. Dalla lettura, è possibile che la sicurezza sia impostata correttamente e si possa utilizzare localhost in app.config, ma il sistema sembra voler provare e creare il DB in SQLEXPRESS ... che non è configurato affatto. – beauXjames

5

In un ambiente condiviso penso sia corretto rendere ogni applicazione abbia accesso solo al proprio database e non essere in grado di creare un Banca dati. Verificare con il fornitore dell'ambiente condiviso come procedere per ottenere un nuovo database attivo e funzionante. Un'opzione facile per inizializzarsi correttamente è inviare un backup del db all'amministratore del server e chiedere il ripristino del backup.

Codice EF Primo/Le migrazioni possono essere eseguite per non creare automaticamente o eseguire la migrazione automatica dei database quando vengono eseguiti in un ambiente di produzione tramite 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."); 
     } 
    } 
    } 
} 

Attiva con un costruttore statico nella vostra DbContext:

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

Grazie Andres - come sarebbe l'inizializzatore db personalizzato nel mio codice? – user1261952

+0

Anche quello che ho collegato (incollato sopra) dovrebbe funzionare così com'è. –

+0

non ha funzionato Andres - mi dispiace per essere un dolore. hai 5 minuti per accedere a skype o gmail? posso condividere il mio schermo con te - in questo modo avrai la possibilità di guardare anche le mie altre impostazioni. Potrei fare qualcosa di stupido in un'altra parte dell'app. Grazie. – user1261952

2

Non si dispone di privilegi di amministratore sul spazio server SQL vostra società di hosting. La vera ragione per cui potresti essere in grado di rilasciare ma fallirà quando EF tenterà il passaggio CREATE DATABASE. Le inizializzazioni del database non vengono eseguite nelle app di produzione.

  1. Se si dispone di accesso e fatto la vostra dev su una scala di SQL Server (non espresso). Basta fare un backup, caricarlo e ripristinarlo nello spazio del server SQL di hosting.

  2. Se si è utilizzato SQLExpress, è necessario generare lo script SQL di ogni oggetto sui dati ed eseguirlo nello spazio del server SQL di hosting. Facoltativamente, se è possibile ricreare il database su un server SQL su vasta scala che consente di risparmiare l'attività di generazione ed esecuzione di script.

  3. Commenta parti di inizializzazione del database del codice.

  4. Distribuire il codice sorgente nello spazio di hosting.
  5. Modificare la stringa di connessione in modo che faccia riferimento alla copia del database sul server SQL del tuo hosting.
  6. Prega che tutto funzioni senza intoppi. :) In caso contrario, considera il pensiero che una volta che l'app è in esecuzione, ti sei appena guadagnato un anello bianco sulla distribuzione del progetto WebAPI/EF.
Problemi correlati