2

Я совершенно новичок в использовании кода для моделирования баз данных. Я попытался следовать нескольким различным учебным пособиям и столкнуться с проблемами со всеми из них, и не могу понять, почему.Код структуры Entity Сначала, не генерируя базу данных

Прямо сейчас у меня есть новый проект MVC 4. Я работаю над этим проектом с тремя другими, и мы используем Team Foundation Server для управления версиями. После различных учебники я настроить свои модели как так:

public class User 
{ 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 

    public virtual ICollection<Entry> Entries { get; set; } 
    public virtual ICollection<Rating> Ratings { get; set; } 
} 

public class Contest 
{ 
    public int ContestId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime End { get; set; } 
    public Boolean Published { get; set; } 

    public virtual ICollection<Submission> Submissions { get; set; } 
    public virtual ICollection<Tab> Tabs { get; set; } 
} 

public class Tab 
{ 
    public int TabId { get; set; } 
    public string Name { get; set; } 
    public int Order { get; set; } 
    public string Content { get; set; } 
    public int ContestId { get; set; } 

public virtual Contest Contest { get; set; } 
} 

public class Entry 
{ 
    public int EntryId { get; set; } 
    public string Title { get; set; } 
    public string EmbedURL { get; set; } 
    public string Description { get; set; } 
    public Boolean isApproved { get; set; } 
    public int UserId { get; set; } 

    public virtual ICollection<Submission> Submissions { get; set; } 

    public virtual User User { get; set; } 
} 

public class Submission 
{ 
    public int SubmissionId { get; set; } 
    public DateTime Submitted { get; set; } 
    public int EntryId { get; set; } 
    public int ContestId { get; set; } 

    public virtual Entry Entry { get; set; } 
    public virtual Contest Contest { get; set; } 
} 

public class Rating 
{ 
    public int RatingId { get; set; } 
    public int Stars { get; set; } 
    public int UserId { get; set; } 
    public int SubmissionId { get; set; } 


    public virtual User User { get; set; } 
    public virtual Submission Submission { get; set; } 
} 

и создал расширение DbContext:

public class CPContext : DbContext 
{ 
    public CPContext() : base("name=CPContext") 
    { 
    } 

    public DbSet<Contest> Contests { get; set; } 
    public DbSet<User> Users { get; set; } 
    public DbSet<Entry> Entries { get; set; } 
    public DbSet<Submission> Submissions { get; set; } 
    public DbSet<Rating> Ratings { get; set; } 
    public DbSet<Tab> Tabs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 

Наконец, строку подключения в моем файле Web.config:

<add name="CPContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet_ContestPlatform;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 

В дополнение ко всему этому, я инициализирует свою базу данных с тестовыми данными ниже:

//Will seed the database with dummy values when accessed for first time 
public class ContestPlatformInitializer : DropCreateDatabaseIfModelChanges<CPContext> 
{ 
    protected override void Seed(CPContext context) 
    { 
     var users = new List<User> 
     { 
      new User { FirstName = "Daniel", LastName = "Hines", Email = "[email protected]" }, 
      new User { FirstName = "Peter", LastName = "Pan", Email = "[email protected]" }, 
      new User { FirstName = "Marie", LastName = "VerMurlen", Email = "[email protected]" }, 
      new User { FirstName = "Aaron", LastName = "Brown", Email = "[email protected]" } 
     }; 
     users.ForEach(s => context.Users.Add(s)); 
     context.SaveChanges(); 

     var entries = new List<Entry> 
     { 
      new Entry { UserId = 1, Title = "Flight Simulation", EmbedURL = "www.blah.com/video1", Description = "This is an awesome app!", isApproved = true }, 
      new Entry { UserId = 2, Title = "Underwater Explorer", EmbedURL = "www.blah.com/video1", Description = "This is an awesome app!!", isApproved = true }, 
      new Entry { UserId = 3, Title = "Dress-Up", EmbedURL = "www.blah.com/video1", Description = "This is an awesome app!!!", isApproved = true }, 
      new Entry { UserId = 4, Title = "Combat Training", EmbedURL = "www.blah.com/video1", Description = "This is an awesome app!!!!", isApproved = true }, 
      new Entry { UserId = 1, Title = "Fitness Pro", EmbedURL = "www.blah.com/video1", Description = "This is an awesome app!!!!!", isApproved = true } 
     }; 
     entries.ForEach(s => context.Entries.Add(s)); 
     context.SaveChanges(); 

     var contests = new List<Contest> 
     { 
      new Contest { Name = "Game Contest", Description = "This contest is to see who can make the most awesome game!", Start = DateTime.Parse("2012-02-10"), End = DateTime.Parse("2012-04-20"), Published = true }, 
      new Contest { Name = "App Contest", Description = "This contest is to see who can make the coolest app!", Start = DateTime.Parse("2012-03-10"), End = DateTime.Parse("2012-09-20"), Published = false } 
     }; 
     contests.ForEach(s => context.Contests.Add(s)); 
     context.SaveChanges(); 

     var tabs = new List<Tab> 
     { 
      new Tab { ContestId = 1, Name = "Rules", Content = "The first rule is that there are no rules!", Order = 1 }, 
      new Tab { ContestId = 2, Name = "Examples", Content = "No examples here yet, check back soon.", Order = 1} 
     }; 
     tabs.ForEach(s => context.Tabs.Add(s)); 
     context.SaveChanges(); 

     var submissions = new List<Submission> 
     { 
      new Submission { ContestId = 1, EntryId = 1, Submitted = DateTime.Parse("2-13-2012") }, 
      new Submission { ContestId = 1, EntryId = 2, Submitted = DateTime.Parse("2-14-2012") }, 
      new Submission { ContestId = 1, EntryId = 3, Submitted = DateTime.Parse("2-15-2012") }, 
      new Submission { ContestId = 1, EntryId = 4, Submitted = DateTime.Parse("2-16-2012") }, 
     }; 
     submissions.ForEach(s => context.Submissions.Add(s)); 
     context.SaveChanges(); 

     var ratings = new List<Rating> 
     { 
      new Rating { Stars = 4, UserId = 1, SubmissionId = 1 }, 
      new Rating { Stars = 5, UserId = 2, SubmissionId = 1 }, 
      new Rating { Stars = 2, UserId = 3, SubmissionId = 1 }, 
      new Rating { Stars = 4, UserId = 4, SubmissionId = 1 }, 

      new Rating { Stars = 1, UserId = 1, SubmissionId = 2 }, 
      new Rating { Stars = 2, UserId = 2, SubmissionId = 2 }, 
      new Rating { Stars = 1, UserId = 3, SubmissionId = 2 }, 
      new Rating { Stars = 3, UserId = 4, SubmissionId = 2 }, 

      new Rating { Stars = 5, UserId = 1, SubmissionId = 3 }, 
      new Rating { Stars = 5, UserId = 2, SubmissionId = 3 }, 
      new Rating { Stars = 4, UserId = 3, SubmissionId = 3 } 
     }; 
     ratings.ForEach(s => context.Ratings.Add(s)); 
     context.SaveChanges(); 
    } 
} 

, который вызывается в моем приложении Application_Start() в моем файле Global.asax.

Итак, теперь, чтобы проверить, что все работает правильно, я создал контроллер для моей модели Contest, который сгенерировал соответствующее представление. Когда я компилирую свое приложение и пытаюсь вызвать контроллер Contest, генерируется исключение.

System.Data.EntityCommandExecutionException был необработанное кодом пользователя Message = Произошла ошибка при выполнении определения команды. Подробнее см. Внутреннее исключение. Источник = System.Data.Entity StackTrace: на System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior) на System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType] (ObjectContext контексте, ObjectParameterCollection parameterValues) на System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) на System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Collections.Generic.List 1..ctor (IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 источник) на ContestPlatform.Controllers.ContestController.Index() в C: \ Пользователи \ Danny \ Documents \ Visual Studio 2010 \ Projects \ ContestPlatform \ ContestPlatform \ ContestPlatform \ Controllers \ ContestController.cs: строка 21 на lambda_method (Закрытие, ControllerBase, Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary`2 parameters) в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c_ DisplayClass42.b _41() at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c_ DisplayClass37. <> c _DisplayClass39.b_ 33() at System.Web.Mvc.Async.AsyncControllerActionInvoker. <> c _DisplayClass4f.b__49() InnerException: System.Data.SqlClient.SqlException Сообщение = Недопустимое имя объекта 'dbo.Contest'. Источник Provider = .Net SqlClient данных ErrorCode = -2146232060 Класс = 16 LineNumber = 1 Number = 208 Процедура = "" Server = \ SQLEXPRESS State = 1 StackTrace:. в System.Data.SqlClient .SqlConnection.OnError (SqlException исключение, булева breakConnection) на System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() в System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) на System.Data.SqlClient.SqlDataReader.ConsumeMetaData() в System.Data.SqlClient.SqlDataReader.get_MetaData() в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader Д.С., runBehavior runBehavior, String resetOptionsString) в System.Data .SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavio г cmdBehavior, RunBehavior runBehavior, булева returnStream, метод String, DbAsyncResult результат) на System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булевой returnStream, метод String) на System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) на System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) на System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (entityCommand entityCommand, поведение CommandBehavior) InnerException:

замечая строка «Сообщение = Недопустимое имя объекта» dbo.Contest », я хотел удвоить ch eck, что фактически была создана таблица dbo.Contest.

Я могу войти в Management Studio Express и посмотреть базу данных «aspnet_ContestPlatform», но у нее нет таблиц.

Это база данных, которую я должен видеть? Почему таблицы не генерируются? Также, если таблиц нет, почему я не получаю исключение, когда приложение запускается, когда база данных должна быть засеяна тестовыми данными?

ответ

1

Нет, имя базы данных должно быть [YourNamespace, если есть] .CPContext, а не «aspnet_ContestPlatform».

Я думаю, причина, по которой вы не получаете немедленного исключения, заключается в том, что только когда вы нажимаете на представление, которое использует контроллер, который фактически выполняет ваши GetResults против базы данных, на которую он падает. Что-то мешает созданию базы данных - не уверен, что - но пока вы не выбираете ее, ничего не удается в приложении.

Вы пробовали модифицировать модель и запустить приложение еще раз? Я часто сохраняю фиктивное свойство на одном из моих второстепенных объектов, которое я поочередно комментирую вкл/выкл, чтобы восстановить базу данных. Я знаю, что это не лучший способ сделать что-то, но модель меняется, поэтому база данных должна падать и воссоздаваться.

+0

Изменена модель и снова запущена, как вы предложили, с тем же результатом. Я попытался использовать SQL Server Compact вместо этого, указав другую строку подключения и столкнувшись с совершенно новой проблемой, получив сообщение об ошибке, когда у меня нет разрешения на доступ к базе данных. Исследовал эту проблему и пытался исправить миллион вещей, но STILL не может заставить EF правильно создавать базу данных независимо от того, что я пытаюсь сделать. – Danny

+0

Ну, трудно понять, что происходит, но еще одна вещь, которую вы можете попробовать: удалить все из своей модели, кроме одного класса, с одним простым свойством. Просто прокомментируйте остальное. И соответствующим образом измените CPContext. Rerun, и посмотреть, есть ли что-то в модели, которую EF не устраивает. –

+0

Ну, я воссоздал проект с нуля и скопировал весь свой код, и по какой-то причине он теперь работает. Единственное различие прямо сейчас заключается в том, что я не добавил его в TFS. Может, в этом и проблема? – Danny