此问题已在所有地方被询问,但CodePlex上的支持解决方法不起作用。
我希望有人有一些更新的信息。
我有一个EF5 Code First项目,我有几十个直接派生自抽象基类的实体。在创建从派生自该基类的类派生的一些新实体之后,当我的数据库最初创建时,我收到以下错误:
You cannot use Ignore method on the property 'DisplayString' on type
'Doctor' because this type inherits from the type
'Contact' where this property is mapped. To exclude
this property from your model, use NotMappedAttribute or Ignore
method on the base type.
这是我的课程:
public abstract class AbsoluteBaseClass
{
[NotMapped]
public abstract string DisplayString { get; set; }
...
}
public class Contact : AbsoluteBaseClass
{
[NotMapped]
public override string DisplayString
{
get { return string.Format("{0} {1}", FirstName, LastName); }
set { throw new System.NotImplementedException(); }
}
...
}
public class Doctor : Contact
{
...
}
我还有其他这样的情况(派生自派生自基类的类)并且我已经开始工作了,但是添加这些新类会再次破坏它们。
我也尝试在OnModelCreating中添加.Ignore指令(基数之前的派生类),这也没有任何区别。
modelBuilder.Entity<Doctor>().Ignore(p => p.DisplayString);
modelBuilder.Entity<Contact>().Ignore(p => p.DisplayString);
我有几种情况,我有从AbsoluteBaseClass派生的实体,大部分时间都有效,但后来我会添加另一个派生类,事情会再次破坏。似乎没有任何押韵或理由。
我真的很欣赏一些关于如何在添加课程时明确地让它工作的建议。似乎提到应用于EF5源的修复程序,然后您构建源。有没有人试过这个并让它起作用?
感谢您的任何建议! 科里。
答案 0 :(得分:0)
就我而言,在现有数据库上使用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
,因为表已经存在)并解决了有问题的错误。