EntityEntry.Property() 在 属性 确实存在时抛出 InvalidOperationException
EntityEntry.Property() throws InvalidOperationException when property does exist
大家好我有以下类:
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 块包围 var p = entity.Property(prop.Name);
并忽略异常,但让异常在审计场景中不断抛出并不是一件好事。它还会对性能产生影响。
非常感谢任何解决方法。谢谢
这是因为 entity
是 EntityEntry
。您应该正确命名您的变量以免混淆:
foreach (var entiry in changedEntries)
{
var entity = entiry.Entity;
var entityType = 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) == null)
continue;
var p = entity.Property(prop.Name);
if (p.IsModified)
props.Add(new { f = prop.Name, o = p.OriginalValue, c = p.CurrentValue });
}
}
}
问题是 Property
方法在您通过导航调用它时仅支持原始属性 属性。
您可以使用通过 EntityEntry.Metadata
属性 which returns IEntityType
访问的 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 });
大家好我有以下类:
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 块包围 var p = entity.Property(prop.Name);
并忽略异常,但让异常在审计场景中不断抛出并不是一件好事。它还会对性能产生影响。
非常感谢任何解决方法。谢谢
这是因为 entity
是 EntityEntry
。您应该正确命名您的变量以免混淆:
foreach (var entiry in changedEntries)
{
var entity = entiry.Entity;
var entityType = 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) == null)
continue;
var p = entity.Property(prop.Name);
if (p.IsModified)
props.Add(new { f = prop.Name, o = p.OriginalValue, c = p.CurrentValue });
}
}
}
问题是 Property
方法在您通过导航调用它时仅支持原始属性 属性。
您可以使用通过 EntityEntry.Metadata
属性 which returns IEntityType
访问的 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 });