Добавить приватное поле из абстрактного класса в миграцию - PullRequest
0 голосов
/ 06 марта 2019

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

Свойство 'BaseField' не является объявленным свойством для типа 'ChildClass'.Убедитесь, что свойство не было явно исключено из модели с помощью метода Ignore или аннотации данных NotMappedAttribute.Убедитесь, что это допустимое примитивное свойство.

Вот моя текущая (и желаемая) настройка:

public abstract class BaseClass
{
     private string BaseField{ get; set; }

     internal class BaseClassConfiguration<T> : EntityTypeConfiguration<T> where T : BaseClass
     {
         internal BaseLogbookConfiguration()
         {
             Property(p => p.BaseField);
         }
     }
}

public class ChildClass : BaseClass
{
    private string ChildField { get; set; }

    internal class ChildClass : BaseClassConfiguration<ChildClass>
    {
        internal ChildClass ()
        {
            Property(p => p.ChieldField);
        }
    }

}

, а затем в моем DbContext

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Configurations.Add(new ChildClass.ChildClassConfiguration());
 }

После выполнения добавления-миграции my_migration я получаю сообщение об ошибке выше.Я попытался изменить уровень доступа BaseField на защищенный или внутренний, и они оба вызвали одну и ту же ошибку.Тем не менее, изменение его на public правильно создало миграцию, включая собственное приватное поле ChildClass.

   AddColumn("dbo.ChildClass", "ChildField", c => c.String());
   AddColumn("dbo.ChildClass", "BaseField", c => c.String());

Однако я не хочу, чтобы классы за пределами моей библиотеки могли иметь прямой доступ к BaseField.Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 07 марта 2019

В вашем примере кода тип ChildClass не содержит поле или переменную с именем BaseField. Он содержит поле с именем ChildField.

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

...