忽略 EF CodeFirst 中所有已实现的接口属性
Ignoring all implemented interface properties in EF CodeFirst
不久前,我对 edmx 模型使用了数据库优先方法。我创建了部分 类 来扩展 edmx 生成的领域模型的功能。
//Generated by tt in edmx
public partial class DomainObject
{
public int PropertyA {get; set;}
public int PropertyB {get; set;}
}
//My own partial that extends functionality on generated one
public partial class DomainObject: IDomainEntity
{
public int EntityId {get; set;}
public int EntityTypeId {get; set;}
public int DoSomethingWithCurrentEntity()
{
//do some cool stuff
return 0;
}
}
所有部分都在实现接口 IDomainEntity
public interface IDomainEntity
{
int EntityId {get; set;}
int EntityTypeId {get; set;}
int DoSomethingWithCurrentEntity();
//Another huge amount of properties and functions
}
所以这个接口的所有属性都没有映射到数据库中的表
现在我已经迁移到 Code First 方法,所有这些属性都试图映射到数据库。当然,我可以使用 [NotMapped] 属性,但界面中的属性数量和 类 数量巨大(超过 300 个)并且还在继续增长。有什么方法可以一次忽略所有 类 的部分或接口的所有属性。
您可以使用反射找出要忽略的属性,然后在 DbContext.OnModelCreating
方法中使用 Fluent API 忽略它们:
foreach(var property in typeof(IDomainEntity).GetProperties())
modelBuilder.Types().Configure(m => m.Ignore(property.Name));
不久前,我对 edmx 模型使用了数据库优先方法。我创建了部分 类 来扩展 edmx 生成的领域模型的功能。
//Generated by tt in edmx
public partial class DomainObject
{
public int PropertyA {get; set;}
public int PropertyB {get; set;}
}
//My own partial that extends functionality on generated one
public partial class DomainObject: IDomainEntity
{
public int EntityId {get; set;}
public int EntityTypeId {get; set;}
public int DoSomethingWithCurrentEntity()
{
//do some cool stuff
return 0;
}
}
所有部分都在实现接口 IDomainEntity
public interface IDomainEntity
{
int EntityId {get; set;}
int EntityTypeId {get; set;}
int DoSomethingWithCurrentEntity();
//Another huge amount of properties and functions
}
所以这个接口的所有属性都没有映射到数据库中的表
现在我已经迁移到 Code First 方法,所有这些属性都试图映射到数据库。当然,我可以使用 [NotMapped] 属性,但界面中的属性数量和 类 数量巨大(超过 300 个)并且还在继续增长。有什么方法可以一次忽略所有 类 的部分或接口的所有属性。
您可以使用反射找出要忽略的属性,然后在 DbContext.OnModelCreating
方法中使用 Fluent API 忽略它们:
foreach(var property in typeof(IDomainEntity).GetProperties())
modelBuilder.Types().Configure(m => m.Ignore(property.Name));