C# 实体框架5不能对属性使用Ignore方法

C# 实体框架5不能对属性使用Ignore方法,c#,ef-code-first,entity-framework-5,C#,Ef Code First,Entity Framework 5,我几乎用尽了解决此错误的所有方法: 请有人给我指一下正确的方向。我已经做了以下工作: 步骤1: 从所有实体和基类的属性中删除NotMapped属性。我的解决方案中根本没有未映射的属性 步骤2: 对所有实体上的所有属性使用OnModelCreating方法中的ignore方法(说真的,这花了我几天的时间,因为我拥有的实体太多了) 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.Entity().Ignore(p=>p.MyPro

我几乎用尽了解决此错误的所有方法:

请有人给我指一下正确的方向。我已经做了以下工作:

步骤1: 从所有实体和基类的属性中删除NotMapped属性。我的解决方案中根本没有未映射的属性

步骤2: 对所有实体上的所有属性使用OnModelCreating方法中的ignore方法(说真的,这花了我几天的时间,因为我拥有的实体太多了)

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Ignore(p=>p.MyProperty);
}
但是,当我运行时,会出现以下错误:

无法对类型“Namespace.MyEntity”的属性“MyProperty”使用Ignore方法,因为此类型继承自映射此属性的类型“MyBaseEntity”。若要从模型中排除此属性,请对基类型使用NotMappeAttribute或Ignore方法

我还需要做什么?它肯定没有映射,因为我在模型生成器中忽略了它!!!对


救命啊

我知道这个问题由来已久,但我在任何地方都找不到关于我的场景的明确说明

我只是在不创建数据库的配置和创建数据库但不保存实体的配置之间来回切换

当然,你现在报道的一个例外是最令人恼火的

您可能有发现问题。我需要更多地了解您的模型,以帮助您确定问题所在

“Namespace.MyEntity”看起来像什么?它是否参与了TPT继承映射策略

如果是,您是否有任何1 | 1关系(x.TPT_派生的父类);我被迫使TPT_派生的子类继承自一个独立的项目基类,而不是TPT_派生的父类

在我的解决方案中,我发现,当您有TPT派生类,其中包含引用从不同TPT父类派生的类的非空字段时,代码首先以正确的顺序发现实体是非常重要的

我发现(在我的设置中)当我对派生(第二级)基类使用TPT时,不可能拥有所有其他类(抽象或具体)继承的通用项目基类,而派生自第二级基类的具体类彼此之间需要外键关系

例如,这对我不起作用:

public abstract ProjectBaseClass : IProjectBase
{
      [Key]
      public int ProjectClassesId {get;set;}
}

[Table("TPT_BaseClass1")]
public abstract TPT_Specialized_Base_Class1 : ProjectBaseClass
{
      //...specialized stuff in here
}
[Table("TPT_BaseClass2")]    
public abstract TPT_Specialized_Base_Class2: ProjectBaseClass
{
     //...specialized stuff in here
}

[Table("ConcreteChild")]
public TPT_Child_Concrete_Class : TPT_Specialized_Base_Class1
{
      public int TPT_Parent_Concrete_Class_KeyId {get;set;};

      [ForeignKey("TPT_Parent_Concrete_Class_KeyId ")]
      TPT_Parent_Concrete_Class ParentSpecializedClass {get;set;};

}

[Table("ConcreteParent")]
public TPT_Parent_Concrete_Class : TPT_Specialized_Base_Class2
{
      //optional relationship 
      public int? TPT_Child_Concrete_Class_KeyId {get;set;};

      [ForeignKey("TPT_Child_Concrete_Class_KeyId")]
      TPT_Child_Concrete_Class ChildSpecializedClass {get;set;};

}


public projectContext: DbContext
{
     public DbSet<TPT_Specialized_Base_Class1> 
     public DbSet<TPT_Specialized_Base_Class2> 


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    // There is no configuration I could find that would make the model above work!

    // However, if you make each TPT_Specialized_Base_Class inherit from different
    // ProjectBaseClass like:
    public ProjectBaseClass1 : IProjectBase
    public ProjectBaseClass2 : IProjectBase


    public TPT_Specialized_Base_Class1 : ProjectBaseClass1 {...}
    // and 
    public TPT_Specialized_Base_Class2 : ProjectBaseClass2 {...}

    // or, more sensible... 
    public TPT_Specialized_Base_Class1 : IProjectBase
    // and 
    public TPT_Specialized_Base_Class2 : IProjectBase

    // then you can do the following, making sure you *discover* the child TPT base 
    // class first

    modelBuilder.Entity<TPT_Specialized_Base_Class1>() //this one is inherited by the derived class that has the *required* reference to a TPT derived parent
         .Ignore(x => x.PropertyNamedInErrorMessage);

    modelBuilder.Entity<TPT_Specialized_Base_Class2>();
         .Ignore(x => x.PropertyNamedInErrorMessage);

    // when I flipped the order of the classes above, it could not determine the 
    // principal end of the relationship, had a invalid multiplicity, or just wouldn't 
    // save...can't really remember what it was crying about...

    modelBuilder.Entity<TPT_Child_Concrete_Class>()
     .HasRequired(x => x.TPT_Parent_Concrete_Class ).WithOptional(); 
          & ProjectBaseClass2
    }
}
公共抽象ProjectBaseClass:IProjectBase
{
[关键]
public int ProjectClassesId{get;set;}
}
[表(“TPT_基本类1”)]
公共抽象TPT\U专用\U基础\U类别1:ProjectBaseClass
{
//…这里有专门的东西
}
[表(“TPT_BaseClass2”)]
公共抽象TPT\u专用\u基础\u类2:ProjectBaseClass
{
//…这里有专门的东西
}
[表(“儿童”)]
公共TPT_儿童\u混凝土\u类:TPT_专业\u基础\u类
{
public int TPT_Parent_Concrete_Class_KeyId{get;set;};
[ForeignKey(“TPT\U父项\U混凝土\U类\U密钥ID”)]
TPT_Parent_Concrete_类ParentSpecializedClass{get;set;};
}
[表(“具体母公司”)]
公共TPT\U父级\U具体类:TPT\U专用\U基础\U类2
{
//选择关系
公共int?TPT_Child_Concrete_Class_KeyId{get;set;};
[ForeignKey(“TPT_Child_Concrete_Class_KeyId”)]
TPT_Child_Concrete_Class childSpecialized Class{get;set;};
}
公共项目上下文:DbContext
{
公共数据库集
公共数据库集
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//没有配置,我可以找到,将使上述模型的工作!
//但是,如果您使每个TPT_专用的_基类从不同的
//ProjectBaseClass类似于:
公共项目库类别1:IProjectBase
公共项目库类别2:IProjectBase
公共TPT_专业基础:ProjectBaseClass{…}
//及
公共TPT_专用基础_类2:ProjectBaseClass2{…}
//或者,更明智的。。。
公共TPT_专业基地_类别1:i项目基地
//及
公共TPT_专业基地_类别2:i项目基地
//然后您可以执行以下操作,确保您*发现*子TPT库
//头等舱
modelBuilder.Entity()//该类由具有对TPT派生父类的*required*引用的派生类继承
.Ignore(x=>x.PropertyNamedErrorMessage);
modelBuilder.Entity();
.Ignore(x=>x.PropertyNamedErrorMessage);
//当我翻转上面类的顺序时,它无法确定
//关系的主体端,具有无效的多重性,或者根本不会
//保存…我真的不记得它哭什么了。。。
modelBuilder.Entity()
.HasRequired(x=>x.TPT_Parent_Concrete_Class).WithOptional();
&ProjectBaseClass2
}
}
(从重新发布)

在我的例子中,在现有数据库上使用Code First(EF6)时,我创建了一些基类来处理公共属性,如ID

(注意:以下内容在
OnModelCreating(dbmodelbuildermb)
方法中)

然后,我需要完全忽略基类:

mb.Ignore(new[] {
    typeof(BaseClassA),
    typeof(BaseClassB)
});
然后,有点违反直觉,我需要将基本模型属性注册为:

mb.Entity<BaseClassA>().HasKey(m => m.ID);
mb.Entity<BaseClassB>().Whatever...

这至少已经编译/迁移(迁移时使用
-IgnoreChanges
,因为表已经存在)并解决了问题中的错误。

您没有显示
MyBaseEntity
的映射。
mb.Entity<BaseClassA>().HasKey(m => m.ID);
mb.Entity<BaseClassB>().Whatever...
mb.Entity<DerivedClassB1>().Ignore(m => m.NormallyNotIgnored);