EF Core - ChangeTracker.DetectChanges 从特定 属性 获取价值
EF Core - ChangeTracker.DetectChanges get value from specific property
我需要从 EF 的 ChangeTracker 中的关系中获取 属性 的值。
我有 class:
public class ClienteInfo
{
public Guid Id { get; set; }
public Guid IdTipoCliente { get; set; }
public string Nome { get; set; }
public bool Ativo { get; set; }
public bool Bloqueado { get; set; }
public virtual TipoClienteInfo TipoCliente { get; set; }
}
public class TipoClienteInfo
{
public Guid Id { get; set; }
public string Nome { get; set; }
public bool Ativo { get; set; }
public virtual ICollection<ClienteInfo> Clientes { get; set; }
}
要审核日志,在 属性 IdTipoCliente 上获取 属性 TipoClienteInfo 的名称
我的上下文类:
public class DataBaseContext : DbContext
{
public DbSet<ClienteInfo> Cliente { get; set; }
public DbSet<TipoClienteInfo> TipoCliente { get; set; }
public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
ChangeTracker.DetectChanges();
foreach (var entry in ChangeTracker.Entries())
{
foreach (var property in entry.Properties)
{
//GET HERE THE VALUE
}
}
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
return result;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
RegisterMaps(modelBuilder);
}
public static void RegisterMaps(ModelBuilder builder)
{
builder.ApplyConfiguration(new ClienteMaps());
builder.ApplyConfiguration(new TipoClienteMaps());
}
}
我想使用属性、反射,但不起作用。
您可以通过如下查询从引用(此处:ClienteInfo.TipoCliente
)中获取 属性 个值:
ChangeTracker.Entries<ClienteInfo>()
.Select(e => e.Reference(c => c.TipoCliente)
.TargetEntry.CurrentValues["Nome"])
从你的问题中不清楚你到底想用这些值做什么,但这应该会让你走上正确的轨道。
有几种方法可以更动态地使用它并添加 variables/parameters,例如:
var referenceName = "TipoCliente";
var propertyName = "Nome";
var values = ChangeTracker.Entries<ClienteInfo>()
.Select(e => e.Reference(referenceName)
.TargetEntry.CurrentValues[propertyName])
.ToList();
我需要从 EF 的 ChangeTracker 中的关系中获取 属性 的值。
我有 class:
public class ClienteInfo
{
public Guid Id { get; set; }
public Guid IdTipoCliente { get; set; }
public string Nome { get; set; }
public bool Ativo { get; set; }
public bool Bloqueado { get; set; }
public virtual TipoClienteInfo TipoCliente { get; set; }
}
public class TipoClienteInfo
{
public Guid Id { get; set; }
public string Nome { get; set; }
public bool Ativo { get; set; }
public virtual ICollection<ClienteInfo> Clientes { get; set; }
}
要审核日志,在 属性 IdTipoCliente 上获取 属性 TipoClienteInfo 的名称
我的上下文类:
public class DataBaseContext : DbContext
{
public DbSet<ClienteInfo> Cliente { get; set; }
public DbSet<TipoClienteInfo> TipoCliente { get; set; }
public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
{
ChangeTracker.DetectChanges();
foreach (var entry in ChangeTracker.Entries())
{
foreach (var property in entry.Properties)
{
//GET HERE THE VALUE
}
}
var result = await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
return result;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
RegisterMaps(modelBuilder);
}
public static void RegisterMaps(ModelBuilder builder)
{
builder.ApplyConfiguration(new ClienteMaps());
builder.ApplyConfiguration(new TipoClienteMaps());
}
}
我想使用属性、反射,但不起作用。
您可以通过如下查询从引用(此处:ClienteInfo.TipoCliente
)中获取 属性 个值:
ChangeTracker.Entries<ClienteInfo>()
.Select(e => e.Reference(c => c.TipoCliente)
.TargetEntry.CurrentValues["Nome"])
从你的问题中不清楚你到底想用这些值做什么,但这应该会让你走上正确的轨道。
有几种方法可以更动态地使用它并添加 variables/parameters,例如:
var referenceName = "TipoCliente";
var propertyName = "Nome";
var values = ChangeTracker.Entries<ClienteInfo>()
.Select(e => e.Reference(referenceName)
.TargetEntry.CurrentValues[propertyName])
.ToList();