C# 在实体接口(EF Core)中声明要忽略的属性
EF核心2.2 具有此接口:C# 在实体接口(EF Core)中声明要忽略的属性,c#,.net,entity-framework-core,C#,.net,Entity Framework Core,EF核心2.2 具有此接口: public interface INotPersistingProperties { string MyNotPersistingPropertyA { get; set; } string MyNotPersistingPropertyB { get; set; } } 还有许多实现接口的实体 public class MyEntity : INotPersistingProperties { public int Id { get; set
public interface INotPersistingProperties
{
string MyNotPersistingPropertyA { get; set; }
string MyNotPersistingPropertyB { get; set; }
}
还有许多实现接口的实体
public class MyEntity : INotPersistingProperties
{
public int Id { get; set; }
public string MyNotPersistingPropertyA { get; set; }
public string MyNotPersistingPropertyB { get; set; }
}
对于实现INotPersistingProperties的所有实体,是否有可能自动忽略这些属性(使用Fluent API)?您可以在接口中的属性上放置
NotMapped
,然后使用
或者,您可以创建一个基类,并将属性
NotMapped
放在属性上您可以将NotMapped
放在接口中的属性上,然后使用
或者,您可以创建一个基类并将属性
NotMapped
放在属性上您可以在模型类中的此类属性上使用NotMapped
属性
或者您可以使用DBContext类的OnModelCreating方法中的反射忽略属性,如下所示
foreach(var property in typeof(INotPersistingProperties).GetProperties())
modelBuilder.Types().Configure(m => m.Ignore(property.Name));
可以对模型类中的此类属性使用
NotMapped
属性
或者您可以使用DBContext类的OnModelCreating方法中的反射忽略属性,如下所示
foreach(var property in typeof(INotPersistingProperties).GetProperties())
modelBuilder.Types().Configure(m => m.Ignore(property.Name));
目前,EF Core不提供定义自定义约定的方法,但您可以将以下内容添加到
OnModelCreating
override(在发现所有实体类型后)中,以迭代实现接口的所有实体类型,并为每个属性调用Ignore
fluent API:
var propertyNames = typeof(INotPersistingProperties).GetProperties()
.Select(p => p.Name)
.ToList();
var entityTypes = modelBuilder.Model.GetEntityTypes()
.Where(t => typeof(INotPersistingProperties).IsAssignableFrom(t.ClrType));
foreach (var entityType in entityTypes)
{
var entityTypeBuilder = modelBuilder.Entity(entityType.ClrType);
foreach (var propertyName in propertyNames)
entityTypeBuilder.Ignore(propertyName);
}
目前,EF Core不提供定义自定义约定的方法,但您可以将以下内容添加到
OnModelCreating
override(在发现所有实体类型后)中,以迭代实现接口的所有实体类型,并为每个属性调用Ignore
fluent API:
var propertyNames = typeof(INotPersistingProperties).GetProperties()
.Select(p => p.Name)
.ToList();
var entityTypes = modelBuilder.Model.GetEntityTypes()
.Where(t => typeof(INotPersistingProperties).IsAssignableFrom(t.ClrType));
foreach (var entityType in entityTypes)
{
var entityTypeBuilder = modelBuilder.Entity(entityType.ClrType);
foreach (var propertyName in propertyNames)
entityTypeBuilder.Ignore(propertyName);
}
为了忽略EF Core的所有特定接口类,我使用了以下代码:
protected override void OnModelCreating(ModelBuilder builder)
{
var multitenantTypes = typeof(IMultiTenantEntity)
.Assembly
.GetTypes()
.Where(x => typeof(IMultiTenantEntity).IsAssignableFrom(x))
.ToArray();
foreach (var typeToIgnore in multitenantTypes)
{
builder.Ignore(typeToIgnore);
}
}
为了忽略EF Core的所有特定接口类,我使用了以下代码:
protected override void OnModelCreating(ModelBuilder builder)
{
var multitenantTypes = typeof(IMultiTenantEntity)
.Assembly
.GetTypes()
.Where(x => typeof(IMultiTenantEntity).IsAssignableFrom(x))
.ToArray();
foreach (var typeToIgnore in multitenantTypes)
{
builder.Ignore(typeToIgnore);
}
}
您可以将
NotMapped
用于此类属性您可以将NotMapped
用于此类属性我相信interface属性会起作用,但由于您添加了MetadataType
属性,我想这需要解释。我相信interface属性会起作用,但是由于您添加了MetadataType
属性,我认为这需要解释。这就是问题所在,我不能完善modelBuilder.Types()方法,否则我可以编写modelBuilder.Types().Configure(c=>c.Ignore(p=>p.MyNotPersistingPropertyA));你有哪个EF核心版本?我不确定,但你能试试modelBuilder.Entity().Ignore(c=>c.PropertyName);我想是的……我要去try@GhiniAntonio你可以试试伊万·斯托夫的解决方案,它肯定会奏效。你可以随时信任他的解决方案:)这就是问题所在,我不能完善modelBuilder.Types()方法,否则我可以编写modelBuilder.Types().Configure(c=>c.Ignore(p=>p.MyNotPersistingPropertyA));你有哪个EF核心版本?我不确定,但你能试试modelBuilder.Entity().Ignore(c=>c.PropertyName);我想是的……我要去try@GhiniAntonio你可以试试伊万·斯托夫的解决方案,它肯定会奏效。您可以随时信任他的解决方案:)