11

Sto utilizzando ASP.NET MVC 4 - C# per connettersi a un database attivo ed elencare i risultati, tuttavia quando vado a visualizzare il pagina restituisce il seguente errore:La tabella dell'elenco riporta "autorizzazione CREATE TABLE negata nel database" ASP.NET - MVC4

CREATE TABLE permission denied in database 'DatabaseName'. 

Description: An unhandled exception occurred during the execution 
of the current web request. Please review the stack trace for more 
information about the error and where it 
originated in the code. 



Exception Details: System.Data.SqlClient.SqlException: CREATE TABLE 
permission denied in database 'DatabaseName'. 

Source Error: 


Line 16:   public ActionResult Index() 
Line 17:   { 
Line 18:    return View(db.AccControls.ToList()); 
Line 19:   } 
Line 20 

controller:

namespace TestDBCon.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private DataDbContext db = new DataDbContext(); 

     public ActionResult Index() 
     { 
      return View(db.AccControls.ToList()); 
     } 

    } 
} 

AccControl.cs (modello)

namespace TestDBCon.Models 
{ 
    public class AccControl 
    { 
     public int ID { get; set; } 
     public int ControlCode { get; set; } 
     public string Nominal { get; set; } 
     public string CostCentre { get; set; } 
     public string Department { get; set; } 
    } 

    public class DataDbContext : DbContext 
    { 
     public DbSet<AccControl> AccControls { get; set; } 
    } 
} 

web.Config :

<add name="DataDbContext" connectionString="Data Source=***;initial catalog=***;integrated security=True;" providerName="System.Data.SqlClient" /> 

Non sto cercando di creare un tavolo? Sto solo cercando di elencare i risultati, quindi sono estremamente confuso. Deve essere qualcosa a che fare con il MVC?

Qualsiasi aiuto sarebbe molto apprezzato!

Grazie

+0

La tua web config punta al database corretto ?, puoi mostrarci la dichiarazione e l'inizializzazione di db? – CR41G14

+0

puoi assicurarti che l'utente che stai utilizzando disponga delle autorizzazioni per creare il database. – MMK

+0

@MMK Non è possibile modificare personalmente le autorizzazioni –

risposta

2

È il vostro web config che punta al database corretto?

Le credenziali sono corrette?

Entity Framework creerà tabelle nel database se si utilizzerà lo MVC4 WebSecutiy() per gestire l'autenticazione e l'autorizzazione degli utenti. Questo potrebbe essere l'eccezione.

In questo caso in cui non è possibile creare le tabelle necessarie per il provider di appartenenze, sarà necessario escluderlo dal sistema. Vedi questo here. In alternativa, crea un nuovo progetto MVC4 e seleziona il modello vuoto e inserisci i bit necessari.

+1

Le credenziali sono tutte corrette, io proprio non capisco perché MVC 4 decide di provare e creare una tabella già esistente? (scusate se sono nuovo) –

+0

DbContext utilizza la stringa di connessione DataDbContext? MVC4 avrà anche una stringa di connessione predefinita. Cambia questo per essere uguale alla tua stringa di connessione DataDbContext. Come detto, MVC4 proverà a creare alcune tabelle di utenti se si utilizza la WebSecurity() integrata per gestire gli utenti. – CR41G14

+0

Ho cambiato la connessione predefinita come DataDbContext, che non sembra cambiare nulla. Sto indovinando costruito in WebSecurity() è abilitato, c'è comunque per impedire a MVC4 di farlo (creando tabelle degli utenti)? –

18

So che è vecchio ma poiché ho avuto gli stessi problemi e mi ci è voluto un po 'per trovare la soluzione ... Ho deciso di condividere le informazioni. Così ho dovuto fare 2 cose per sbarazzarsi di questo problema, prima è stato invalidante le migrazioni:

# Migrations/Configuration.cs 
internal sealed class Configuration : DbMigrationsConfiguration<IntranetApplication.Models.MyDb1> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 
} 

tuttavia ciò non bastasse, ho anche dovuto assicurarsi che la seminatrice non viene eseguito. È possibile annullare con questo ulteriore pezzo di codice:

#Global.asax.cs 
protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    Database.SetInitializer<Models.MyDb1>(null); 
    Database.SetInitializer<Models.MyDb2>(null); 

    ... 
} 

Poi finalmente ora posso fare un SELECT con LINQ e l'accesso solo hanno letto

EDIT
Come da suggerimento di Lawrence, è probabilmente meglio averlo direttamente all'interno di DB Context Constructor. Grazie per il suggerimento, ho aggiornato il mio codice. Sembrerebbe invece questo:

public partial class MyDb1 : DbContext 
{ 
    public MyDb1() 
     : base("name=MyDb1Connection") 
    { 
     Database.SetInitializer<Models.MyDb1>(null); 
    } 

    ... 
} 
+3

Questo è fondamentale per Entity Framework per sola lettura e avrebbe dovuto essere contrassegnato come risposta. Senza questo non è possibile modificare il timeout senza che EF provi a migrare. Tuttavia non ha bisogno di essere fatto in Application_Start. se può essere fatto nel costruttore di modelContext. –

+0

Grazie, mi ha salvato il bacon. Questo dovrebbe essere contrassegnato come la risposta corretta. – camainc

Problemi correlati