Entity Framework 5 сначала не создает базу данных
Я пытаюсь создать новую базу данных, используя сначала код Entity Framework. Однако при запуске кода база данных нет создал (используяDropCreateDatabaseIfModelChanges
настройки), хотя код работает нормально. Я'я вижу следующее исключение, когда я пытаюсь получить что-то из базы данных.
Мой проект настроен с использованием отдельногоDataAccess
слой с общим сервисом и построением хранилища. Таким образом, все мои объекты, хранилище, а также контекст базы данных находятся в отдельном проекте в рамках решения.
мойglobal.asax
Файл содержит следующий фрагмент кода.
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
Это должно инициализировать новую базу данных, если она нене так ли?
Мой класс контекста базы данных выглядит следующим образом;
namespace Website.DAL.Model
{
public class MyContext : DbContext
{
public IDbSet Projects { get; set; }
public IDbSet Portfolios { get; set; }
///
/// The constructor, we provide the connectionstring to be used to it's base class.
///
public MyContext()
: base("MyConnectionString")
{
}
static MyContext()
{
try
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
}
catch (Exception)
{
throw;
}
}
///
/// This method prevents the plurarization of table names
///
///
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove();
}
}
}
Мы создали этот класс, следуя нескольким учебникам и статьям в Интернете. Это'Все новое для меня, но, насколько я вижу, все кажется правильным до сих пор. Так что теперь две сущности ям с помощью. Oни'называетсяПроект» а также 'Портфолио', Они похожи на это;
public class Portfolio
{
[Key]
public Guid Id { get; set; }
public String Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool IsPublished { get; set; }
public virtual ICollection Projects { get; set; }
}
А также
public class Project
{
[Key]
public Guid Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool IsPublished { get; set; }
public String Title { get; set; }
}
База данных яя использую работает на внешнем сервере, он пришел с хостинг-провайдеромм с помощью. Я'у нас есть база данных SQL Server, и строка подключения к базе данных находится вweb.config
веб-сайта проекта. Я'мы уже пытались удалить базу данных и позволить коду воссоздать ее, что, к сожалению, нет работа. Я что-то упускаю здесь очевидное? Или это может быть простая вещь, как права доступа к серверу для создания баз данных?
Примечание: когда я запускаюDatabase-Update -Script
Команда для генерации кода SQL, похоже, что созданы правильные операторы SQL для создания всех таблиц.
ОБНОВЛЕНИЕ 1: Хорошо, благодаря некоторым комментариям я пошел немного дальше. Я'мы добавили два свойства в мои объекты, чтобы вызвать некоторые изменения, и ямы также создали собственный инициализатор, как это; я '
public class ForceDeleteInitializer : IDatabaseInitializer
{
private readonly IDatabaseInitializer _initializer = new DropCreateDatabaseIfModelChanges();
public ForceDeleteInitializer()
{
//_initializer = new ForceDeleteInitializer();
}
public void InitializeDatabase(MyContext context)
{
//This command is added to prevent open connections. See http://stackoverflow.com/questions/5288996/database-in-use-error-with-entity-framework-4-code-first
context.Database.ExecuteSqlCommand("ALTER DATABASE borloOntwikkel SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
_initializer.InitializeDatabase(context);
}
}
Мы также удалили инициализатор из конструктора моего контекста, так что это означает, что ямы удалили эту строку кода;
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
После этого я'мы добавили эти три строки в мой файл Global.asax;
Database.SetInitializer(new ForceDeleteInitializer());
MyContext c = new MyContext();
c.Database.Initialize(true);
При отладке ям теперь получаю это исключение;
Это дает мне следующую информацию:
InnerException говорит: провайдер неt вернуть ProviderManifestTokenInnerException в InnerException говорит: «Для этой операции требуется подключение к базе данных masterdatabase. Соединение можетне должно быть шириноймастер'-database, потому что исходное соединение открыто, а ссылки удалены из соединения. Пожалуйста, предоставьте не открытое соединение "После этих действий база данных становится недоступной, поэтому, скорее всего, удаляется ..
Что можно сделать по этому поводу? Это'Скорее всего, я могуДоступ к основной базе данных, потому что мой хостинг-провайдер не выигралдайте мне правильное право доступа конечно.