实体框架6:忽略所有派生类型的basetype属性

时间:2017-08-17 08:56:05

标签: c# .net entity-framework-6 odata

我需要忽略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多个实体,我不能为每个实体手工完成这项工作,特别是考虑到未来的发展。

1 个答案:

答案 0 :(得分:2)

问题似乎与以下事实有关:为每个直接或间接继承Types的类调用BaseEntity方法体,这会导致EF继承问题。

您可以做的是使用过滤器仅对直接派生类型应用配置,如下所示:

modelBuilder.Types<BaseEntity>()
    .Where(t => t.BaseType == typeof(BaseEntity))
    .Configure(clazz => clazz.Ignore(prop => prop.State));