Сначала код ASP.NET Приложение MVC, начальный метод не вызывается

#c# #mysql #asp.net #asp.net-mvc #entity-framework

#c# #mysql #asp.net #asp.net-mvc #entity-framework

Вопрос:

Я следовал этому руководству, чтобы получить рабочий ASP.NET Приложение MVC работает с использованием базы данных MySQL. Я прошел весь путь, но обнаружил, что при запуске моего приложения начальный метод, который я переопределил, никогда не вызывается.

 public class MyDbInitializer : DropCreateDatabaseAlways<MyDbContext>
{
    protected override void Seed(MyDbContext context)
    {
        //Roles
        context.Roles.Add(new Role { role = "admin" });
        context.Roles.Add(new Role { role = "user" });

        //Users
        context.Users.Add(new User { userName = "test", firstName = "Elliot", lastName = "Alderson", email = "ealderson@allsafe.com", phone = "555-555-5555", city = "New York", state = "New York", zipCode = "10001" });

        //User Roles
        context.UserRoles.Add(new UserRole { userName = "test", role = "admin" });

        //Logins
        context.Logins.Add(new Login { userName = "test", password = "test" });

        //Credit Cards
        context.CreditCards.Add(new CreditCard { userName = "test", creditCardNumber = "1234432156788765", expirationDate = new DateTime(2020, 1, 1), svn = "123", brand = "Evil Corp" });

        base.Seed(context);
    }
}
  

Погуглив, я обнаружил, что мне нужно добавить контекст в файл web.config моего приложения, вложенный в тег EntityFramework, что я и сделал

 <entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="mssqllocaldb" />
    </parameters>
  </defaultConnectionFactory>
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  </providers>
  <contexts>
    <context type="COS492_SIP.DAL.MyDbContext, COS492_SIP">
      <databaseInitializer type="COS492_SIP.DAL.MyDbInitializer, COS492_SIP" />
    </context>
  </contexts>
</entityFramework>
  

И, наконец, я изменил свой файл global.asax, чтобы принудительно инициализировать контекст базы данных, который также не работал

 public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        System.Data.Entity.Database.SetInitializer<MyDbContext>(new MyDbInitializer());

        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}
  

Я думаю, это как-то связано с тем, что серверной базой данных является MySQL (я не могу переключиться на другую), поскольку теги EntityFramework ссылаются на mssql. Если это так, как мне это исправить и, в любом случае, как мне вызвать начальный метод?

Редактировать

Класс MyDbContext

 public class MyDbContext : DbContext
{

    public MyDbContext() : base("MyDbContextConnectionString")
    {
        Database.SetInitializer<MyDbContext>(new MyDbInitializer());
    }

    public DbSet<CreditCard> CreditCards { get; set; }
    public DbSet<Login> Logins { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }

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

Строка подключения веб-конфигурации

   <connectionStrings>
    <add name="MyDbContextConnectionString" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;UserId=root;Password=toor;database=gilbert_sip;CharSet=utf8;Persist Security Info=True"/>
  </connectionStrings>
  

Комментарии:

1. Если я не ошибаюсь, вам нужно сделать update-database в консоли диспетчера пакетов Seed() , чтобы быть вызванным.

2. Выдает эту ошибку В сборке ‘COS492_SIP’ не найден тип конфигурации миграции. (В Visual Studio вы можете использовать команду Enable-Migrations из консоли диспетчера пакетов, чтобы добавить конфигурацию миграции).

3. Вы уверены, что у вас есть <connectionStrings> запись в web.config, которая указывает на базу данных? Я не знаю, как настроить его для MySQL, но я знаю, что он находится в <configuration> разделе. По крайней мере, с SQL Server, это необходимо в дополнение к defaultConnectionFactory .

4. Можете ли вы показать свое определение класса MyDbContext? Я думаю, вам нужно переместить строку кода: System.Data.Entity. База данных. SetInitializer<MyDbContext>(новый MyDbInitializer()); в конструктор MyDbContext

5. @KentWeigel H-Герцль только что добавил ConnectionStrings и MyDbContext

Ответ №1:

Попробуйте выполнить следующее в вашем Application_Start :

 System.Data.Entity.Database.SetInitializer<MyDbContext>(new MyDbInitializer());
var db = new MyDbContext();
db.Database.Initialize(true);
  

Комментарии:

1. Похоже, это приблизило меня. Веб-приложение выдало исключение с ошибкой Подробности: Система. Исключение ArgumentException: не удается найти запрошенного поставщика данных .Net Framework. Возможно, он не установлен.

2. Заработало, пришлось установить пакеты NuGet. Спасибо!