EF Code First - Неверное имя столбца

ef-code-first entity-framework-6

Вопрос

Im получает сообщение об ошибке «Недопустимое имя столбца« FeeLevel_LevelId », которое совершенно не имеет смысла, учитывая, что все свойства являются простыми типами, и в этом объекте нет объекта FeeLevel или объекта LevelId.

Итак, мой контекст:

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

POCO:

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

Это отображение:

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

Таблица базы данных:

введите описание изображения здесь

и у него нет отношений. Однако EF генерирует следующий SQL:

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

ОБНОВИТЬ:

Создание нового файла Fees2DbContext, удаляющего другие DbSets, «исправляет» проблему ... но я не знаю, почему ... ни один из этих классов / наборов не связан с рассматриваемым классом.

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

ОБНОВЛЕНИЕ 2:

  public partial class FeesDbContext : DisconnectedEntityContext
    {

        public DbSet<Currency> Currencies { get; set; }

        public DbSet<FeeLevel> FeeLevels { get; set; }

        public DbSet<FeeLevelDetail> FeeLevelDetails { get; set; }

        public DbSet<FeeType> FeeTypes { get; set; }

        public DbSet<MemberFeeDiscountLevel> MemberFeeDiscountLevels { get; set; }

        public FeesDbContext()
            : base("FeesDb") { }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new FeeLevelMap());
            modelBuilder.Configurations.Add(new FeeLevelDetailMap());
            modelBuilder.Configurations.Add(new FeeTypeMap());
            modelBuilder.Configurations.Add(new CurrencyMap());
            modelBuilder.Configurations.Add(new MemberFeeDiscountLevelMap());
        }

        public static void ApplyChanges<TEntity>(TEntity root)
                    where TEntity : class, IObjectWithState
        {
            using (var context = new FeesDbContext())
            {
                context.Set<TEntity>().Add(root);
                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                }
                context.SaveChanges();
            }
        }
}

Принятый ответ

FeeLevel.MemberFeeDiscountLevels является навигационным свойством, и он вводит отношения «один ко многим» между FeeLevel и MemberFeeDiscountLevel : у FeeLevel может быть много MemberFeeDiscountLevels что означает, что в MemberFeeDiscountLevel есть один FeeLevel . Хотя у вас нет свойства навигации и внешнего ключа в MemberFeeDiscountLevel база данных должна иметь внешний ключ в таблице MemberFeeDiscountLevel , чтобы моделировать это отношение. EF принимает имя FK по умолчанию как «имя связанной сущности + подчеркивание + имя первичного ключа » = FeeLevel_LevelId . Поскольку в таблице базы данных нет этого столбца, вы получаете исключение.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему