2012-03-11 21 views
5

Napisałem prostą aplikację .net mvc 3 na VS2010, stosując pierwsze podejście do generowania schematu. Kiedy wdrożyć go do udostępnionego serwera produkcyjnego mam następujący błąd: [SQLException (0x80131904). Uprawnienie CREATE DATABASE odmówiono w bazie danych „mistrza”]Wdrażanie kodu EF Pierwsze aplikacje do bazy danych produkcji

Oto mój kod modelu:

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

tutaj jest mój kod kontrolera:

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

    } 

i tu jest mój ciąg połączenia dla bazy produkcyjnej

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

Jestem nowy w asp.net mvc - proszę o poradę, jak uruchomić moją aplikację na bazie danych opartej na produkcji, gdzie nie mogę uruchomić sql.

Dzięki!

+2

Należy pamiętać, że wysłano hasło do bazy danych w konfiguracji. Myślę, że powinieneś zmienić swoje hasło ... –

Odpowiedz

1

Problem tutaj nie musi być Twoim kodem.

CREATE DATABASE permission denied in database 'master'

Komunikat o błędzie powyżej sugeruje, że problem jest Twój łączenia się z bazą danych przy użyciu poświadczeń, które nie mają zdolności do tworzenia nowych elementów. Spróbuj zmienić poświadczenia początkowego utworzenia lub uaktualnienia możliwości konta, z którym łączysz się z

+0

To prawda, ale myślę, że chodzi o to, że próbuje całkowicie połączyć się z niewłaściwym DB. Odczytanie może mieć skonfigurowane zabezpieczenia i możesz używać localhost w app.config, ale wydaje się, że system chce spróbować utworzyć bazę danych w SQLEXPRESS ... która nie jest w ogóle skonfigurowana. – beauXjames

5

Uważam, że w środowisku współdzielonym każda aplikacja ma dostęp tylko do własnej bazy danych i nie może utworzyć Baza danych. Sprawdź u dostawcy współdzielonego środowiska, jak zrobić, aby nowa baza danych została uruchomiona. Łatwą opcją, aby go poprawnie zainicjować, jest przesłanie kopii zapasowej bazy danych do administratora serwera i poproszenie o przywrócenie kopii zapasowej.

Kod EF Pierwszy/Migracje można wykonać, aby nie tworzyć automatycznie lub automatycznie migrować baz danych po uruchomieniu w środowisku produkcyjnym przez 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."); 
     } 
    } 
    } 
} 

Włącz go ze statycznym konstruktorze w swojej DbContext:

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

Dzięki Andres - jak wyglądałby niestandardowy inicjator db w moim kodzie? – user1261952

+0

Ten, z którym połączyłem (również wklejony) powinien działać tak, jak jest. –

+0

to nie działa Andres - przepraszam za ból. czy masz 5 minut na zalogowanie się do Skype'a lub Gmaila? Mogę dzielić się z Tobą moim ekranem - w ten sposób będziesz miał szansę przyjrzeć się innym moim ustawieniom. Mogłem robić coś głupiego w innej części aplikacji. Dzięki. – user1261952

2

Nie masz uprawnienia administratora na serwerze SQL przestrzeni swojej firmy hostingowej. To jest powód, dla którego możesz upaść, ale nie powiedzie się, gdy EF spróbuje wykonać krok CREATE DATABASE. Inicjowanie bazy danych najlepiej nie jest wykonywane w aplikacjach produkcyjnych.

  1. Jeśli masz dostęp do swojego dewelopera i wykonałeś go na pełnowymiarowym serwerze SQL (nie ekspresowym). Po prostu wykonaj kopię zapasową, prześlij ją i odtwórz na serwerze hostingowym SQL.

  2. Jeśli korzystasz z SQLExpress, musisz wygenerować skrypt SQL każdego obiektu na swoich danych i uruchomić go na serwerze hostingowym SQL. Opcjonalnie, jeśli możesz odtworzyć bazę danych w pełnej skali SQL Server, który zaoszczędzi ci zadania generowania i wykonywania skryptów.

  3. Skomentuj inicjalizację bazy danych części kodu.

  4. Wdróż swój kod źródłowy do swojego hostingu.
  5. Zmodyfikuj ciąg połączenia tak, aby wskazywał kopię bazy danych na serwerze SQL serwera hostingowego.
  6. Módl się, aby wszystko działało sprawnie. :) Jeśli nie, pomyśl o tym, że po uruchomieniu aplikacji właśnie zdobyłeś biały pasek na wdrożenie projektu WebAPI/EF.
Powiązane problemy