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();
}
?
你可以试试:
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