我几乎用尽了所有的解决方法针对此错误: http://entityframework.codeplex.com/workitem/481
请能有人指出我在正确的方向。 我也做了以下情况:
步骤1:从在所有实体和基类的属性中删除NotMapped属性。 有我的解决方案的离开了没有NotMapped属性。
第2步:使用方法忽略在所有实体的所有属性的OnModelCreating方法(这严重我花了几天时间与实体的数量之多,我有)
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().Ignore(p => p.MyProperty);
}
然而,当我跑我得到以下错误:
“你不能使用忽略对类型‘Namespace.MyEntity’属性‘myProperty的’方法,因为这种类型的从那里这个属性映射类型‘MyBaseEntity’继承。从你的模型排除此属性,使用NotMappedAttribute或忽略方法基类型“。
我需要什么呢? 这绝对不是映射,因为我已经在模型构建忽略了它! 对!?
救命!!!
我知道这个问题是旧的,但我不能在任何地方找到我的方案明确指示。
我正要来回,不会创建一个配置,创建的数据库数据库和模型配置之间,但不会拯救实体!
当然,在非常特殊的,你现在的报告是最让人头疼的处理的一个!
你可能有一个发现问题。 我需要看到更多的模型,以帮助您确定的问题。
什么是“Namespace.MyEntity”是什么样子? 难道是参与TPT继承映射策略是什么?
如果是这样,你有什么1间| 1间的关系(< - 不太可能),或者1间|与其他TPT实体*的关系?
我完全猜在这里,但这个花了一些试验和错误要弄清楚,所以我会后它来帮助任何人搜索你的错误和[ - TPT | 表每种类型| 必需| 关系| 家长| 儿童| 共享| 基地| 摘要 - ]
在我的情况下,当我有,这是modelBuilder.Entity()之间的关系,需要HasRequired(X => x.TPT_Derived_Parent_Class).WithOptional(); 我被迫做出的TPT_Derived_Child_Class从一个单独的项目基类比TPT_Derived_Parent_Class继承
我发现,在我的解决方案,当你有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
}
}
(从重新发布EF5代码第一-你不能使用忽略的财产法 )
在我的情况下,现有的数据库上使用代码优先(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
,但我相信你可以做同样的规律流利的:
mb.Entity<DerivedClassB1>().Ignore(m => m.NormallyNotIgnored);
这至少已编译/迁移(与-IgnoreChanges
上的迁移,因为表已经存在)和解决问题的错误。