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

Ghi*_*nio 4 .net c# entity-framework-core .net-core

EF 核心 2.2

有这个界面:

public interface INotPersistingProperties
{
   string MyNotPersistingPropertyA { get; set; }
   string MyNotPersistingPropertyB  { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以及许多实现该接口的实体

public class MyEntity : INotPersistingProperties
{
  public int Id { get; set; }
  public string MyNotPersistingPropertyA { get; set; }
  public string MyNotPersistingPropertyB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

对于所有实现 INotPersistingProperties 的实体,是否有机会自动忽略这些属性(使用 Fluent API)?

Iva*_*oev 7

目前 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);
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*e V 5

您可以将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; }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以创建一个基类并将属性放在NotMapped您的属性上