Измените Global.asax.cs
, включая событие Application_Start
, с помощью:
Database.SetInitializer<YourDatabaseContext>(
new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
Вы сказали, что интересовались почему, таким образом:
В реальном режиме сегмент является 64K "окном" к физической памяти, и эти окна расположены с интервалами на расстоянии в 16 байтов. В защищенном режиме сегмент является окном или к физической памяти или к виртуальной памяти, размер которой и местоположение определяются ОС, и это имеет много других свойств, включая то, какой уровень полномочий процессу, должно быть, придется получить доступ к нему.
Отсюда на, все, что я говорю, относится к защищенному режиму.
Существует таблица в памяти, названной глобальной таблицей дескрипторов (GDT), которая является, где информация об этих размерах окна и местоположениях и других свойствах хранится. На основе для каждого процесса могут также быть локальные таблицы дескрипторов, и они работают похожим способом, таким образом, я просто сфокусируюсь на GDT.
Значение, которое Вы загружаете в сегментный регистр, известно как селектор сегмента. Это - индекс в GDT или LDT с небольшим количеством дополнительной информации о безопасности. Естественно, если программа пытается загрузить дескриптор, который является вне границ GDT, исключение происходит. Также, если процесс не имеет достаточного полномочия получить доступ к сегменту, или что-то еще недопустимо, исключение происходит.
Когда исключение происходит, ядро обрабатывает его. Этот вид исключения был бы, вероятно, классифицирован как отказ сегментации. Таким образом, ОС закрывает Вашу программу.
Существует один заключительный протест: в x86 системе команд Вы не можете загрузить непосредственные значения в сегментные регистры. Необходимо использовать промежуточный регистр или операнд памяти или POP в сегментный регистр.
MOV DS, 160 ;INVALID - won't assemble MOV AX, 160 ;VALID - assembles, but will probably result in an MOV DS, AX ;exception, and thus the death of your program
Я думаю, что нужно указать, что архитектура допускает "кучу" сегментов. Но AFAIK, когда дело доходит до господствующей тенденции x86 операционные системы, сегментные регистры служат только нескольким целям:
Кроме сегмента на поток для TLS, действительно только горстка сегментов (времена количество процессоров) используется, и только ОС. Прикладные программы могут полностью проигнорировать сегментные регистры.
Это происходит из-за дизайна ОС, не к любым техническим ограничениям. Могут быть встроенные операционные системы, которые требуют, чтобы программы пространства пользователя работали с сегментными регистрами, хотя я не знаю ни о ком.
Вы пишете исполняемые файлы окон?
В защищенном режиме (Win32) сегментные регистры больше не используются.
Модель памяти также решительно отличается с былых времен 16-разрядного мира. Под Win32 мы не должны быть обеспокоены моделью памяти или сегментом больше! Существует только одна модель памяти: Модель сплошной памяти. Больше нет 64K сегментов. Память является большим непрерывным пространством 4 ГБ. Это также означает, что Вы не должны играть с сегментными регистрами. Можно использовать любой сегментный регистр для обращения к любой точке в пространстве памяти. Это - БОЛЬШАЯ справка к программистам. Это - то, что делает блок Win32, программируя столь же легкий как C.