C# 在实体接口(EF Core)中声明要忽略的属性

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

EF核心2.2

具有此接口:

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你可以试试伊万·斯托夫的解决方案,它肯定会奏效。您可以随时信任他的解决方案:)