实体框架5不能在属性上使用Ignore方法

时间:2013-03-20 14:00:46

标签: c# ef-code-first entity-framework-5

我几乎已经用尽了这个bug的所有变通办法: http://entityframework.codeplex.com/workitem/481

请有人指出我正确的方向。我做了以下事情:

第1步: 从所有实体和基类中的属性中删除NotMapped属性。根本没有NotMapped属性留在我的解决方案中。

第2步: 对OnModelCreating方法中的ignore方法使用所有实体上的所有属性(严重的是,这花了我几天的实体数量)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
      modelBuilder.Entity<MyEntity>().Ignore(p => p.MyProperty);
}

然而,当我跑步时,我收到以下错误:

“您不能在类型'Namespace.MyEntity'上对属性'MyProperty'使用Ignore方法,因为此类型继承了映射此属性的类型'MyBaseEntity'。要从模型中排除此属性,请使用NotMappedAttribute或Ignore基类型的方法。“

我还需要做什么?它绝对没有映射,因为我在模型构建器中忽略了它!没错!?

帮助!!!

2 个答案:

答案 0 :(得分:0)

我知道这个问题很老,但我无法在任何地方找到关于我的方案的明确指示。

我只是在配置之间来回切换,这些配置不会创建数据库和模型,这些配置创建数据库,但不会保存实体!

当然,你现在报道的非常例外是最令人恼火的事情之一!

您可能遇到发现问题。我需要查看更多您的模型,以帮助您确定问题所在。

'Namespace.MyEntity'是什么样的?它是否参与TPT继承映射策略?

如果是这样,您是否与其他TPT实体有任何1 | 1关系(&lt; - 不太可能)或1 | *关系?

我在这里完全猜测,但这需要一些试验和错误来弄明白,所以我会发布它以帮助任何搜索你的错误的人和[ - TPT |每种类型的表|必需|关系|家长|孩子|分享|基地|摘要 - ]

在我的场景中,当我需要一个关系是modelBuilder.Entity()。HasRequired(x =&gt; x.TPT_Derived_Parent_Class).WithOptional();我被迫使TPT_Derived_Child_Class从一个单独的项目基类继承而不是TPT_Derived_Parent_Class

我发现,在我的解决方案中,当您拥有带有非可空字段的TPT派生类时,Code First以正确的顺序发现 非常重要。不同的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
    }
}

答案 1 :(得分:0)

(从EF5 code first - You cannot use Ignore method on the property重新发布)

就我而言,在现有数据库上使用Code First (EF6)时,我创建了一些基类来处理ID等常见属性。

(注意:以下内容属于OnModelCreating(DbModelBuilder mb)方法)

然后我需要完全忽略基类

mb.Ignore(new[] {
    typeof(BaseClassA),
    typeof(BaseClassB)
});

然后,有点违反直觉,我需要注册基本模型属性:

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

我的一个派生类需要忽略其中一个基本属性(称之为 NormallyNotIgnored )。我使用了EntityTypeConfiguration,但我认为你可以用常规的Fluent做同样的事情:

mb.Entity<DerivedClassB1>().Ignore(m => m.NormallyNotIgnored);

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