首页 > 解决方案 > 将抽象类中的私有字段添加到迁移

问题描述

我有一个带有私有字段的抽象基类,我想为每个继承类添加到我的数据库中。我目前收到以下错误

属性“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());
 }

在执行 add-migration my_migration 时,我得到了上面的错误。我尝试将 BaseField 的访问级别更改为受保护或内部,它们都导致了相同的错误。但是,将其更改为 public 正确构建了迁移,包括 ChildClass 自己的私有字段。

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

但是,我不希望我的库之外的类能够直接访问 BaseField。我怎么解决这个问题?

标签: c#asp.netentity-frameworkef-code-first

解决方案


在您的代码示例中,该类型ChildClass不包含名为的字段或变量BaseField.它包含名为的字段ChildField

我可以看到BaseClass包含 a BaseField,但它被标记为私有,这意味着它不是继承的。如果您希望它被继承,请将其标记为受保护或公开。


推荐阅读