gpt4 book ai didi

c# - 当属性确实存在时,EntityEntry.Property() 抛出 InvalidOperationException

转载 作者:行者123 更新时间:2023-12-05 00:49:27 25 4
gpt4 key购买 nike

大家好,我有以下类(class):

public class EntityA
{
public Guid Id { get; set; }
public string Desc { get; set; }

public EntityB EntityB { get; set; }
}

public class EntityB
{
public Guid Id { get; set; }
public Guid EntityAId { get; set; }
public EntityA EntityA { get; set; }
}

我有以下运行时代码:

var a1 = new EntityA {Desc = "a1"};
var a2 = new EntityA {Desc = "a2"};
dbx.EntityAs.Add(a1);
dbx.EntityAs.Add(a2);

var b1 = new EntityB { EntityAId = a1.Id };
dbx.EntityBs.Add(b1);
dbx.SaveChanges();
b1.EntityAId = a2.Id;
dbx.SaveChanges();

我在我的 DbContext.SaveChanges() 方法中修改了如下代码,试图找出实体中的哪个属性发生了变化以及它的前后值:

foreach (var entity in changedEntites)
{
var entityType = entity.Entity.GetType();

if (entity.State == EntityState.Modified)
{
var properties = entityType.GetProperties();
var props = new List<object>();
foreach (var prop in properties)
{
if(entityType.GetProperty(prop.Name) == null)
continue;
var pp = entityType.GetProperty(prop.Name);
if(pp.GetValue(entity.Entity) == null)
continue;

var p = entity.Property(prop.Name);
if (p.IsModified)
props.Add(new { f = prop.Name, o = p.OriginalValue, c = p.CurrentValue });
}
}
}

有问题的代码在这一行:

var p = entity.Property(prop.Name);

它抛出 InvalidOperationException:

The property 'EntityA' on entity type 'EntityB' could not be found.
Ensure that the property exists and has been included in the model.

我的问题是为什么连 entityType.GetProperty(prop.Name)entityType.GetProperty(prop.Name).GetValue(entity.Entity) 也不为空, entity.Property() 还是找不到属性?

我可以用 try-catch block 包围 var p = entity.Property(prop.Name); 并忽略异常,但是让异常在审计场景中继续抛出不是好东西。它也会对性能产生影响。

非常感谢任何解决方法。谢谢

最佳答案

问题是 Property 方法仅支持原始属性,而您使用导航属性调用它。

您可以使用通过返回 IEntityTypeEntityEntry.Metadata 属性访问的 ER Core 元数据服务。在您的情况下,FindProperty 方法,虽然您应该真正使用 GetProperties 而不是首先使用反射:

if (entity.Metadata.FindProperty(prop.Name) == null)
continue;

var p = entity.Property(prop.Name);
if (p.IsModified)
props.Add(new { f = prop.Name, o = p.OriginalValue, c = p.CurrentValue });

关于c# - 当属性确实存在时,EntityEntry.Property() 抛出 InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40543829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com