Что лучший способ состоит в том, чтобы изменить учетные данные службы Windows с помощью C#

Я провел много дней, чтобы решить эту проблему, проанализировал много разных сообщений и попробовал много вариантов и, наконец, исправил. Это два проекта в моем решении с использованием первых миграций EF-кода:

  • Консольное приложение «DataModel», которое в основном используется как сборка, которая содержит все мои первые объекты кода, DbContext, Mirgations и общий репозиторий. Я включил в этот проект отдельный пустой файл локальной базы данных (в папке DataModel / App_Data), чтобы иметь возможность генерировать миграцию из консоли диспетчера пакетов.
  • WebApi, который ссылается на проект DataModel и использует файл локальной базы данных из папки WebApi / App_Data, который не включен в проект

. Я получил эту ошибку при запросе WebApi .. .

Моя среда:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional с обновлением 1
  • все мои проекты, предназначенные для .NET Framework 4.6.1
  • EntityFramework 6.1.3 из NuGet

Здесь я собрал все замечания, на которые вы должны обратить внимание, и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:

  1. Вы должны использовать только одну версию пакета EntityFramework Nuget для всех проектов в вашем решении.
  2. База данных, созданная путем запуска последовательно всех сценариев миграции, должна иметь та же структура / схема, что и целевая база данных, и соответствует модели сущности. Следующие 3 вещи должны точно соответствовать / отражать / соответствовать друг другу: весь ваш сценарий миграции до последнего текущего состояния модели первого объекта текущего кода (DbContext, entity) Целевая база данных
  3. Целевая база данных (файл mdf) должна обновляться / соответствуют последнему сценарию миграции. Убедитесь, что таблица «__MigrationHistory» в вашей целевой базе данных содержит записи для всех сценариев миграции, которые вы имеете, это означает, что все сценарии миграции были успешно применены к этой базе данных. Я рекомендую вам использовать Visual Studio для генерации правильного кода первых сущностей и контекста, соответствующих вашей базе данных, Project -> Добавить новый элемент -> Модель данных Entity Data ADO.NET -> Код First из базы данных: Of Конечно, в качестве альтернативы, если у вас нет базы данных, вы можете написать модель вручную (код первых сущностей и контекста), а затем сгенерировать начальную миграцию и базу данных.
  4. Название строки подключения, например. MyConnectionString в файле конфигурации проекта запуска (Web.config / App.config):
    
      
        
      
    
    
    должен быть равен параметру, переданному в конструкторе вашего DbContext:
     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. Перед использованием консоли диспетчера пакетов убедитесь, что что вы используете правильную базу данных для обновления или создания миграции, а необходимый проект задается в качестве запуска проекта решения. Для подключения к базе данных он будет использовать строку подключения из этого файла .config, который в проекте, который задан как проект запуска.
  6. И главное, что исправило мою проблему: это странно, но в моей папке WebApi / bin DataModel.exe был старым, а не обновлялся с момента последней сборки. Так как миграции были встроены в мою сборку DataModel.exe, то моя обновленная база данных WebApi использовала старые зеркала. Я был смущен, почему после обновления базы данных в WebApi он не соответствует последнему сценарию миграции из DataModel. Следующий код автоматически создает (если не существует) или обновляет последнюю локальную локальную миграцию в моей папке WebApi / App_Data.
       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion()); 
               ...
    
    Я попробовал очистить и перестроить решение, но это не помогло, чем я полностью удалил папки bin и obj из WebApi, удалил файлы базы данных из WebApi / App_Data, создал, перезапустил WebApi, сделал запрос к нему, создал правильную базу данных - ленивый инициализация (используя строки выше), что соответствует последней миграции и исключению, больше не отображается. Таким образом, это может решить вашу проблему: удалите вручную bin, obj-папки из вашего проекта запуска (который генерирует / обновляет вашу базу данных), создайте ваш проект запуска или лучше очистите и перестройте все ваше решение. воссоздайте базу данных, запустив проект (выполнив строки выше) или воспользуйтесь командой «Обновление-база данных» диспетчера пакетов. вручную проверьте, соответствует ли сгенерированный db и __MirgationHistory последнему сценарию миграции.

6
задан Adam Neal 17 February 2012 в 22:19
поделиться

2 ответа

Вот один быстрый и грязный метод с помощью Системы. Классы управления.

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace ServiceTest
{
  class Program
  {
    static void Main(string[] args)
    {
      string theServiceName = "My Windows Service";
      string objectPath = string.Format("Win32_Service.Name='{0}'", theServiceName);
      using (ManagementObject mngService = new ManagementObject(new ManagementPath(objectPath)))
      {
        object[] wmiParameters = new object[11];
        wmiParameters[6] = @"domain\username";
        wmiParameters[7] = "password";
        mngService.InvokeMethod("Change", wmiParameters);
      }
    }
  }
}
6
ответ дан 17 December 2019 в 00:16
поделиться

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

1
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: