[英]Declare properties to ignore in entities interface (EF Core)
英孚核心 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)?
目前 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);
}
为了忽略 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
放在界面中的属性上,然后使用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
放在您的属性上
您可以在模型类中的NotMapped
属性上使用NotMapped
属性。
或者您可以在 DBContext 类的OnModelCreating
方法中使用反射忽略属性,如下所示。
foreach(var property in typeof(INotPersistingProperties).GetProperties())
modelBuilder.Types().Configure(m => m.Ignore(property.Name));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.