我需要忽略State
上的属性abstract class BaseEntity
,但我不能在不使用[NotMappedAttribute]
的情况下使用此属性,但如果我使用该属性,该属性也会被忽略在OData API中。
我已经设置了一个github项目来测试它: https://github.com/nurf3d/EntityFrameworkDerivedTypesIgnoreProperiesTest/tree/master
继承链:
public abstract class BaseEntity
{
[Key]
public int ID { get; set; }
[Timestamp]
public byte[] Rowversion { get; set; }
public State State { get; set; }
}
[Table("Events")]
public abstract class Event : BaseEntity
{
public int PersonID { get; set; }
public string EventName { get; set; }
public virtual Person Person { get; set; }
}
public class DerivedEvent1 : Event
{
public bool IsDerivedEvent1 { get; set; }
}
public class DerivedEvent2 : Event
{
public bool IsDerivedEvent2 { get; set; }
}
属性:
使用[NotMappedAttribute]
时,所有类型的State
属性都会被正确忽略,并且迁移运行正常,但这也会从OData API中删除该属性,这是我们不想要的。
由于我们需要OData API中的State
属性,因此我们不使用[NotMappedAttribute]
,而是使用流畅的配置。
流利配置:
modelBuilder.Types<BaseEntity>().Configure(clazz => clazz.Ignore(prop => prop.State));
add-migration Initial -Force
导致此错误:
您不能在“EntityFrameworkIgnoreProperty.Models.DerivedEvent1”类型的属性“State”上使用Ignore方法,因为此类型继承了映射此属性的“EntityFrameworkIgnoreProperty.Models.BaseEntity”类型。要从模型中排除此属性,请在基类型上使用NotMappedAttribute或Ignore方法。
我需要使用Fluent api,我需要同时为所有派生类型的BaseEntity
执行此操作。
在我的真实项目中,我有100多个实体,我不能为每个实体手工完成这项工作,特别是考虑到未来的发展。
答案 0 :(得分:2)
问题似乎与以下事实有关:为每个直接或间接继承Types
的类调用BaseEntity
方法体,这会导致EF继承问题。
您可以做的是使用过滤器仅对直接派生类型应用配置,如下所示:
modelBuilder.Types<BaseEntity>()
.Where(t => t.BaseType == typeof(BaseEntity))
.Configure(clazz => clazz.Ignore(prop => prop.State));