Код первый подход не создает таблицу - PullRequest
0 голосов
/ 21 сентября 2018

Я занимаюсь разработкой приложения в Core 2.0 и использую удостоверения для создания таблиц.Поэтому, когда я запускаю приложение, база данных автоматически создается.Позже, когда я пытаюсь запустить команду миграции, она не создает таблицу.// DAL

public class ApplicationDbContext:IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options):base(options)
        {

        }
        public DbSet<tblContact> tblContacts { get; set; }

        //protected override void OnModelCreating(ModelBuilder builder)
        //{
        //    base.OnModelCreating(builder);
        //}
    }

// Обязательный класс таблицы

 public partial class tblContact
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ContactId { get; set; }
        public string PhoneNumber { get; set; }
    }

Ниже приведены команды, которые я выполнил

  • add -igration 20180921
  • update-database -verbose

В конце вывода в консоли написано Номер ошибки: 2714, Состояние: 6, Класс: 16 В объекте уже есть объект с именем «AspNetRoles»база данных.

Еще одна вещь: когда я удаляю базу данных и запускаю приложение, необходимые таблицы создаются автоматически без выполнения какой-либо команды.Что мне здесь не хватает?Ниже приведен файл Start.cs

public class Startup
    {
        public Startup(IConfiguration configuration, IHostingEnvironment env)
        {
            Configuration = configuration;
            var builder = new ConfigurationBuilder()
           .SetBasePath(env.ContentRootPath)
           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
           .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
           .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddDbContext<ApplicationDbContext>(options =>
            {
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
            });
            services.AddIdentity<ApplicationUser, IdentityRole>()
               .AddEntityFrameworkStores<ApplicationDbContext>()
               .AddDefaultTokenProviders();
            services.ConfigureApplicationCookie(config =>
            {
                // Cookie settings
                config.ExpireTimeSpan = TimeSpan.FromHours(2);
                config.SlidingExpiration = true;
                config.LoginPath = "/Account/Login";
                config.LogoutPath = "/Account/LogOut";
                config.AccessDeniedPath = "/Account/AccessDenied";
            });
            services.AddTransient<IAccountBAL, AccountBAL>();
            services.AddSingleton<IConfiguration>(Configuration);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IAccountBAL _iAccountBAL)
        {
            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
            SeedDatabase.Initialize(app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope().ServiceProvider);
            _iAccountBAL.CreateDefaultRoles().Wait();
            _iAccountBAL.CreateSuperAdmin().Wait();
        }
    }


 public static void Initialize(IServiceProvider serviceProvider)
        {
            var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
            var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
            context.Database.EnsureCreated();
        }

1 Ответ

0 голосов
/ 21 сентября 2018

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

private static void InitializeMigrations(IApplicationBuilder app)
{
    using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
    {
        MyDbContext dbContext = serviceScope.ServiceProvider.GetRequiredService<MyDbContext>();
        dbContext.Database.Migrate();

    }
}

Из MSDN

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

Обратите внимание, что этот API не использует миграции для создания базы данных.Кроме того, созданная база данных не может быть позже обновлена ​​с помощью миграций.Если вы нацелены на реляционную базу данных и используете миграции, вы можете использовать метод DbContext.Database.Migrate(), чтобы убедиться, что база данных создана и все миграции применены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...