11

Używam ASP.NET MVC 4 - C# do łączenia się z żywą bazą danych i lista wyników, jednak gdy przejdę do widoku strona zwraca następujący błąd:Tabela z listą wyników "Odmowa dostępu do tabeli CREATE TABLE w bazie danych" 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 

Kontroler:

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

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

    } 
} 

AccControl.cs (model)

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

Nie próbuję utworzyć tabeli? Próbuję tylko wyświetlić wyniki, więc jestem bardzo zdezorientowany. To musi mieć coś wspólnego z MVC?

Każda pomoc będzie bardzo ceniona!

Dzięki

+0

Czy twoja konfiguracja internetowa wskazuje poprawną bazę danych ?, czy możesz pokazać nam deklarację i inicjalizację db? – CR41G14

+0

można upewnić się, że użytkownik, którego używasz, ma uprawnienia do tworzenia bazy danych. – MMK

+0

@MMK Nie mogę osobiście zmienić uprawnień –

Odpowiedz

2

Czy Twój web config wskazując prawidłowej bazy danych?

Czy dane logowania są prawidłowe?

Entity Framework utworzy tabele w bazie danych, jeśli zamierzasz używać uwierzytelniania i autoryzacji użytkowników pod numerem MVC4 WebSecutiy(). Może to być wyjątek.

W tym przypadku, gdy nie można utworzyć tabel potrzebnych dostawcy członkostwa, należy wykluczyć to z systemu. Zobacz ten here. Alternatywnie możesz utworzyć nowy projekt MVC4 i wybrać pusty szablon, a następnie umieścić potrzebne bity.

+1

Wszystkie poświadczenia są poprawne, po prostu nie rozumiem, dlaczego MVC 4 postanawia spróbować utworzyć już istniejący stół? (Przepraszam, jestem nowy) –

+0

Czy twój DbContext używa łańcucha połączenia DataDbContext? MVC4 będzie miał również domyślny ciąg połączenia. Zmień to na takie samo, jak ciąg połączenia DataDbContext. Tak jak powiedziałem, MVC4 spróbuje utworzyć tabele niektórych użytkowników, jeśli używasz wbudowanej funkcji WebSecurity() do obsługi użytkowników. – CR41G14

+0

Zmieniłem domyślne połączenie na takie samo, jak DataDbContext, które nie zmienia niczego. Zgaduję, wbudowany w WebSecurity() jest włączony, czy jest tak czy inaczej, aby uniemożliwić MVC4 (tworzenie tabel użytkowników)? –

18

Wiem, że jest stary, ale ponieważ miałem te same problemy i znalezienie rozwiązania zajęło mi trochę czasu ... Postanowiłem podzielić się informacjami. Więc musiałem zrobić 2 rzeczy, aby pozbyć się tego problemu, 1 został wyłączanie migracje:

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

jednak, że nie było wystarczająco dużo, miałem również upewnić się, że punktowe nie działa. Można odwołać go z tego dodatkowego kawałka kodu:

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

    ... 
} 

wreszcie mogę teraz zrobić SELECT z LINQ i tylko do odczytu

EDIT
Zgodnie z sugestią Lawrence'a, to najprawdopodobniej lepiej mając go bezpośrednio wewnątrz Konstruktora Kontekstu DB. Dzięki za podpowiedź, zaktualizowałem swój kod. Zamiast tego wyglądałoby to następująco:

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

    ... 
} 
+3

Ma to kluczowe znaczenie dla Entity Framework tylko do odczytu i powinno być oznaczone jako odpowiedź. Bez tego nie można zmienić limitu czasu bez EF, który próbuje migrować. Jednak nie trzeba tego robić w Application_Start. jeśli można to zrobić w konstruktorze modeluContext. –

+0

Dzięki, uratowałem mój bekon. To powinno być oznaczone jako poprawna odpowiedź. – camainc

Powiązane problemy