Недопустимое имя столбца при добавлении миграции

#asp.net-core #.net-5 #asp.net5

#asp.net-ядро #.net-5 #asp.net5

Вопрос:

Я использую .NET 5 и получаю эту ошибку при попытке добавить столбец в свою базу данных. Единственными исправлениями, которые я нашел до сих пор, было установить правильный проект запуска, но поскольку у меня нет двух проектов, я не знаю, как это исправить.

Произошла ошибка при доступе к Microsoft.Расширения.Услуги хостинга. Продолжение без поставщика службы приложений. Ошибка: недопустимое имя столбца ‘EspStartTime’. Невозможно создать объект типа ‘ApplicationDbContext’. Для различных шаблонов, поддерживаемых во время разработки, см. https://go.microsoft.com/fwlink/?linkid=851728

ApplicationDbContext

 internal class TaskEntityTypeConfiguration : IEntityTypeConfiguration<Task>
    {
        public void Configure(EntityTypeBuilder<Task> builder)
        {
            builder.Property(e => e.Description)
                .HasConversion(
                    xml => xml.ToString(),
                    xml => xml != null ? XElement.Parse(xml) : null)
                .HasColumnType("xml");
        }
    }
    internal class StudentAssignedTaskEntityTypeConfiguration : IEntityTypeConfiguration<StudentAssignment>
    {
        public void Configure(EntityTypeBuilder<StudentAssignment> builder)
        {
            builder.Property(e => e.FeedbackXml)
                .HasConversion(
                    xml => xml.ToString(),
                    xml => xml != null ? XElement.Parse(xml) : null)
                .HasColumnType("xml");
            builder.Property(e => e.StudentSubmissionAttachmentsXml)
                .HasConversion(
                    xml => xml.ToString(),
                    xml => xml != null ? XElement.Parse(xml) : null)
                .HasColumnType("xml");
            builder.Property(e => e.StudentSubmissionXml)
                .HasConversion(
                    xml => xml.ToString(),
                    xml => xml != null ? XElement.Parse(xml) : null)
                .HasColumnType("xml");
        }
    }
    public class ApplicationDbContext : IdentityApplicationDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
            //this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
        }

        public static readonly ILoggerFactory Factory
            = LoggerFactory.Create(builder => { builder.AddConsole(); });

        

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseLoggerFactory(Factory);
        }

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

            foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
                relationship.DeleteBehavior = DeleteBehavior.Restrict;

            builder.Entity<ApplicationUser>().HasMany(x => x.TeacherGroups).WithOne(x => x.Teacher).OnDelete(DeleteBehavior.SetNull);
            builder.Entity<ApplicationUser>().HasMany(x => x.StudentGroups).WithMany(x => x.Students);
            builder.Entity<SchoolClassStudentTerm>().HasKey(x => new { x.StudentId, x.SchoolClassId, x.TermId });
            builder.ApplyConfiguration(new TaskEntityTypeConfiguration());
            builder.ApplyConfiguration(new StudentAssignedTaskEntityTypeConfiguration());


            builder.Entity<GroupAssignment>().HasOne(x => x.ClassroomGroup).WithMany(x => x.GroupAssignments).OnDelete(DeleteBehavior.Cascade);
            builder.Entity<GroupAssignment>().HasMany(x => x.StudentAssignments).WithOne(x => x.GroupAssignment).OnDelete(DeleteBehavior.Cascade);
            builder.Entity<GroupAssignment>().HasOne(x => x.Task).WithMany(x => x.GroupAssignments).OnDelete(DeleteBehavior.Cascade);
            builder.Entity<SchoolClassStudentTerm>().HasOne(x => x.Student).WithMany(x => x.SchoolClassStudentTerms).OnDelete(DeleteBehavior.Cascade);
            builder.Entity<StudentAssignment>().HasOne(x => x.Student).WithMany().OnDelete(DeleteBehavior.SetNull);
            builder.Entity<GroupAssignment>().HasOne(x => x.Creator).WithMany(x => x.CreatedGroupAssignments).OnDelete(DeleteBehavior.SetNull);

            builder.Entity<SchoolClass>().HasMany(x => x.SchoolClassStudentTerms).WithOne(x => x.SchoolClass);

            // see https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x?view=aspnetcore-5.0#add-identityuser-poco-navigation-properties
            builder.Entity<ApplicationUser>().HasMany(x => x.UserRoles).WithOne(x => x.User)
                .HasForeignKey(x => x.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
        }
        public DbSet<SchoolClassStudentTerm> SchoolClassStudentTerms { get; set; }
        public DbSet<Term> Terms { get; set; }
        public DbSet<StudentAssignment> StudentAssignments { get; set; }
        public DbSet<ClassroomGroup> ClassroomsGroups { get; set; }
        public DbSet<SchoolClass> SchoolClasses { get; set; }
        public DbSet<GroupAssignment> GroupAssignments { get; set; }
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Subject> Subjects { get; set; }
 

IdentityDbContext

 // see https://docs.microsoft.com/en-us/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-5.0
    public abstract class IdentityApplicationDbContext : IdentityDbContext<
        ApplicationUser, ApplicationRole, string,
        IdentityUserClaim<string>, ApplicationUserRole, IdentityUserLogin<string>,
        IdentityRoleClaim<string>, IdentityUserToken<string>>
    {
        public IdentityApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<ApplicationUser>(b =>
            {
                // Each User can have many entries in the UserRole join table
                b.HasMany(e => e.UserRoles)
                    .WithOne(e => e.User)
                    .HasForeignKey(ur => ur.UserId)
                    .IsRequired();
            });

            modelBuilder.Entity<ApplicationRole>(b =>
            {
                // Each Role can have many entries in the UserRole join table
                b.HasMany(e => e.UserRoles)
                    .WithOne(e => e.Role)
                    .HasForeignKey(ur => ur.RoleId)
                    .IsRequired();
            });
        }
    }
 

ApplicationUser

 public class ApplicationUser : IdentityUser
    {
        public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
        public virtual ICollection<ClassroomGroup> TeacherGroups { get; set; }
        public virtual ICollection<ClassroomGroup> StudentGroups { get; set; }
        public virtual ICollection<Task> CreatedTasks { get; set; }
        public virtual ICollection<SchoolClassStudentTerm> SchoolClassStudentTerms { get; set; }
        public virtual ICollection<GroupAssignment> CreatedGroupAssignments { get; set; }
        public bool Disabled { get; set; }
        public String FullName { get; set; }
        public DateTime? EspStartTime { get; set; }
    }
 

ClassroomGroup

 public class ClassroomGroup
    {
        public int SubjectId { get; set; }
        public virtual Subject Subject { get; set; }
        public virtual SchoolClass SchoolClass { get; set; }
        public int SchoolClassId { get; set; }
        public String TeacherId { get; set; }
        public virtual ApplicationUser Teacher { get; set; }
        public int Id { get; set; }
        public String Title { get; set; }
        public virtual ICollection<ApplicationUser> Students { get; set; }
        public int TermId { get; set; }
        public virtual Term Term { get; set; }
        public virtual ICollection<GroupAssignment> GroupAssignments { get; set; }
    }
 

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

1. Пожалуйста, покажите весь ApplicationDbContext класс.

2. я добавил его в сообщение

3. Я думаю , что проблема в вашем обычае ApplicationUser , вам нужно сообщить об этом контексту, что-то вроде: public class ApplicationDbContext : IdentityDbContext<ApplicationUser> В нынешнем виде контекст не знает EspStartTime , потому что он использует встроенный IdentityUser … но я не знаю, что IdentityApplicationDbContext это такое, поэтому настройте соответствующим образом.

4. Я пытался это сделать, но, похоже, IdentityDbContext не принимает никаких аргументов, я добавил его в сообщение, если это поможет.

5. Хорошо, эта часть выглядит правильно для меня, вы IdentityApplicationDbContext : IdentityDbContext<ApplicationUser,...> добавили миграцию и обновили базу данных?