c# это Исключение, когда код сначала попытался создать базу данных




создание базы данных в visual studio 2017 (6)

Попал в ту же проблему и нашел свое решение here . все, что вам нужно сделать, это остановить LocalDb, открыв командную строку VS-разработчика и введите (без кавычек):

"sqllocaldb.exe stop v11.0"

"sqllocaldb.exe удалить v11.0"

В следующий раз EF будет регенерировать файл, а также db.

Я создал новое приложение ASP.NET MVC 4 и хотел бы, чтобы он сначала использовал код. Однако, по-видимому, он не создает исходный файл базы данных, если он уже не существует. Если я удалю файл .mdf из папки App_Data, я получаю следующее исключение, когда приложение пытается получить доступ к базе данных:

System.Data.SqlClient.SqlException: Cannot attach the file '<path-to-db-file>.mdf' as database '<my-db-file-name>'.

Если я запустил его в приложении в отладчике, то я вижу, что это исключение происходит в методе InitializeSimpleMembershipAttribute :: OnActionExecuting при вызове LazyInitializer.EnsureInitialized. Исключенное исключение:

[System.Reflection.TargetInvocationException]   {"Exception has been thrown by the target of an invocation."}   System.Reflection.TargetInvocationException

С внутренним исключением:

[System.InvalidOperationException]  {"The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588"} System.InvalidOperationException

В этом случае первое исключение я упомянул выше как внутреннее исключение.

Любые идеи, что я делаю неправильно?

Обновить

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

  1. Создайте приложение MVC в мастере VS.
  2. Запустите приложение в первый раз и перейдите на страницу входа (обратите внимание, что файл mdf теперь генерируется).
  3. Удалите файл mdf и вернитесь на страницу входа в систему. Исключение теперь выбрано.

что исправлено для меня, когда я получал эту ошибку, я изменил строку подключения в файле App.config моего VS Project.

Я добавил это в строку подключения:

  <connectionStrings>
<add name="Blog" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Integrated Security=true;AttachDbFileName=C:\Users\kostadin\Database1.mdf" providerName="System.Data.SqlClient" />

Надеюсь, это помогает кому-то другому.


Если вы вникнете в класс InitializeSimpleMembershipAttribute вашего приложения, вы увидите следующий переопределенный метод класса ActionFilterAttribute, из которого он наследует:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Ensure ASP.NET Simple Membership is initialized only once per app start
        LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
    }

Обратите внимание на этот комментарий. Приложение проверяет один раз за запуск, чтобы убедиться, что Simple Membership была правильно инициализирована. Посмотрите на частные переменные в верхней части класса:

    private static SimpleMembershipInitializer _initializer;
    private static object _initializerLock = new object();
    private static bool _isInitialized;

Все они статичны, и все они передаются как ref. Важным здесь для вашей ситуации является _isInitialized . То, что LazyInitializer.EnsureInitialized делает, проверяет флаг _isInitialized и, если он является ложным, инициализирует переданную ему цель ref, в этом случае _initializer типа SimpleMembershipInitializer . В этот момент он устанавливает флаг в true и переходит. Если LazyInitializer.EnsureInitialized видит, что флаг является истинным, он ничего не возвращает, а возвращает цель. Поскольку этот флаг является статической переменной, он сохраняет свою ценность для жизни приложения, что означает, что после этой первой инициализации EnsureInitialized всегда будет просто возвращать цель, даже если файл базы данных больше не существует. Другими словами, если вы удалите файл .mdf после инициализации, приложение не будет знать, и исключения будут выбрасываться, когда приложение попытается прочитать или записать из базы данных. Чтобы решить эту проблему, вам необходимо перезапустить приложение, что означает убийство сервера dev, если это то, что вы используете или перезапускаете приложение в IIS.

Так вот в чем проблема, с которой вы столкнулись, но я подозреваю, что многие из людей, работающих по этому вопросу, имеют аналогичную, но различную проблему, где они получают сообщение об ошибке, подобное этому при попытке входа в систему:

CREATE FILE обнаружил ошибку операционной системы 5 (Access is denied.) При попытке открыть или создать физический файл «C: \ path \ to \ your \ project \ App_Data \ dbfile.mdf». CREATE DATABASE не удалось. Некоторые имена файлов не могут быть созданы. Проверьте связанные ошибки.

Это очень легко решить, так как я быстро это рассмотрю.

По умолчанию Visual Studio 2012 использует уменьшенную версию SQL Server Express под названием LocalDB. LocalDB будет разворачивать дочерний процесс приложения, и если вы запускаете свое приложение на сервере разработки Visual Studio (например, http: // localhost: [порт] - это то, что отображается в вашем браузере), то вы запускаете оба приложения и LocalDB под учетной записью пользователя, а не под SYSTEM или NETWORKSERVICE. Все, что вам нужно сделать, чтобы исправить это, - это назначить для пользователя права на изменение прав доступа к папке App_Data вашего проекта. Повторите попытку входа и файл .mdf должен быть успешно создан.

Если вам интересно, вы можете узнать больше о LocalDB here.


Вы можете обрабатывать инициализацию базы данных Code First в методе Application_Start файла Global.asax в корневой папке вашего проекта, например:

    protected void Application_Start()
    {
        Database.SetInitializer<MyDBContext>(null);
    }

Если вы передадите null в SetInitializer, он не будет создавать или изменять таблицы базы данных, вы должны сделать это вручную.

Причина, по которой база данных не создается повторно, заключается в том, что Application_Start запускается только один раз в течение срока действия приложения.


Созданный MVC код работает со строкой подключения базы данных с именем «DefaultConnection». Если вы использовали другое имя в Web.config, вам нужно обратиться к этому имени в:

  1. InitializeSimpleMembershipAttribute.SimpleMembershipInitializer.ctor () в InitializeSimpleMembershipAttribute.cs).
  2. UsersContext.ctor () в AccountModel.cs

(или просто выполните поиск «DefaultConnection» в вашем проекте).


Вы должны остановить свой экземпляр IISExpress и снова перезапустить его (нажав F5 в Visual Studio). Затем вы сможете снова создать базу данных.







ef-code-first