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

ldioqlga  于 2023-01-31  发布在  .NET
关注(0)|答案(4)|浏览(360)

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)?

j9per5c4

j9per5c41#

目前EF Core不提供定义自定义约定的方法,但您可以将以下内容添加到OnModelCreating覆盖(在发现所有实体类型后),以迭代实现接口的所有实体类型,并为每个属性调用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);
}
unguejic

unguejic2#

为了忽略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);
        }

    }
5lwkijsr

5lwkijsr3#

您可以将NotMapped放在接口中的属性上,然后使用MetadataType属性

public interface INotPersistingProperties
{
   [NotMapped]
   string MyNotPersistingPropertyA { get; set; }
   [NotMapped]
   string MyNotPersistingPropertyB  { get; set; }
}

[MetadataType(typeof(INotPersistingProperties))]
public class MyEntity : INotPersistingProperties
{
  public int Id { get; set; }
  public string MyNotPersistingPropertyA { get; set; }
  public string MyNotPersistingPropertyB { get; set; }
}

也可以创建一个基类并将属性NotMapped放在属性上

wgmfuz8q

wgmfuz8q4#

您可以在模型类中的此类属性上使用NotMapped属性。
或者,您可以在DBContext类的OnModelCreating方法中使用反射来忽略这些属性,如下所示。

foreach(var property in typeof(INotPersistingProperties).GetProperties())
    modelBuilder.Types().Configure(m => m.Ignore(property.Name));

相关问题