EF 6.1 Fluent API:忽略基类的属性

本文关键字:基类 属性 Fluent API EF | 更新日期: 2023-09-27 18:05:33

我有一个所有实体的基类:

public class BaseClass
{
    public int SomeProperty {get; set;}
}
public class SomeEntity : BaseClass
{
    ...
}

在某些情况下我想忽略这个属性。我可以在OnModelCreating方法中这样做吗:

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Properties<int>()
                    .Where(p => p.Name == "SomeProperty")
                    .Ignore();
}

?

EF 6.1 Fluent API:忽略基类的属性

你可以试试:

modelBuilder.Entity<SomeEntity>().Ignore(p => p.SomeProperty);

将导致SomeProperty不被映射到SomeEntity

编辑:如果这个属性永远不应该映射到数据库,你可以在你的BaseClass:

添加NotMapped注释
public class BaseClass
{
    [NotMapped]
    public int SomeProperty {get; set;}
}

这与在所有扩展类中忽略此属性相同。

你能重写它吗?

public class SomeEntity : BaseClass
{    
    [NotMapped]
    public override int SomeProperty { get; set; }
    ...
}

这是一个较晚的条目-但如果它是有用的…

最近遇到了类似的需求,我这样做了:-

public class MyContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder mb)
    {
        mb.Types<EntityBase>()
          .Configure(config => config.Ignore(x => x.SomeBaseClassPropertyToIgnore));
    }
}

这将把给定的配置应用于从EntityBase继承的所有实体类型。同样的技术可以用于基于它们实现的接口来配置实体类型(无论如何可能是一种更好的方法)。

优势:-

  • 无需为多个具体实体编写和维护相同的配置代码。
  • 不需要[NotMapped]属性,它不太灵活,并且增加了潜在的不必要的依赖关系。

注意,如果需要,可以进一步过滤目标类型:-

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Types<EntityBase>().Where(t => t != typeof(SpecialExceptionEntity)).Configure(...);
}

: -

https://msdn.microsoft.com/en-us/library/dn235653 (v = vs.113) . aspx

https://msdn.microsoft.com/en-us/library/dn323206 (v = vs.113) . aspx