我几乎已经用尽了这个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基类型的方法。“
我还需要做什么?它绝对没有映射,因为我在模型构建器中忽略了它!没错!?
帮助!!!
答案 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
,因为表已经存在)并解决了有问题的错误。