搜索具有特定属性及其条目的所有实体

时间:2016-12-09 18:03:17

标签: c# reflection entity-framework-6

我使用EF Code First但我的模型没有关系(PKs - FKs)。所以我试图找到一种方法来解决它,通过使用EF6反射,以避免具有关系的条目删除(相同的属性名称)。

  • 查看我的所有上下文实体,其中包含任何特定属性(FK);
  • 对于找到的每个实体,检查此实体是否有任何条目;
  • 如果是真的,请设置属性"取消"而不是删除我的条目。为真;
  • 如果为false,则保持实体状态被删除并保存我的上下文更改;

    public override int SaveChanges()
    {
        foreach (var myEntity in ChangeTracker.Entries<IAuditable>())
        {
            if (myEntity.State == EntityState.Deleted)
            {
                ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
                var container = objContext.MetadataWorkspace.GetEntityContainer(objContext.DefaultContainerName, DataSpace.CSpace);
    
                var objectStateEntry = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager.GetObjectStateEntry(myEntity.Entity);
                var entityKeys = objectStateEntry.EntityKey.EntityKeyValues;
                var entity = myEntity;
                var hasAnyFk = false;
                foreach (var entityKey in entityKeys)
                {
                    if (hasAnyFk)
                    {
                        break;
                    }
    
                    var keyName = entityKey.Key;
                    foreach (var entitySet in container.EntitySets)
                    {
                        hasAnyFk = entitySet.ElementType.Members.Any(es => es.Name == keyName);
                        if (hasAnyFk)
                        {
                            break;
                        }
                    }
                }
    
                if (hasAnyFk)
                {
                    var deletedProperty = myEntity.OriginalValues.PropertyNames.Where(p => myEntity.Property(p).Name == "Deleted").FirstOrDefault();
                    if (deletedProperty != null)
                    {
                        myEntity.State = EntityState.Modified;
                        myEntity.CurrentValues[deletedProperty] = true;
                    }
                }
            }
        }
    

    return base.SaveChanges(); }

1 个答案:

答案 0 :(得分:0)

你可以处理这是SaveChanges的重载:

public override int SaveChanges()
{
    foreach (var entry in this.ChangeTracker.Entries().Where(e => e.State == 
                                   System.Data.Entity.EntityState.Deleted).ToList())
    {
        var delPropName = "IsDeleted";
        if (entry.OriginalValues.PropertyNames.Contains(delPropName))
        {
            var delProp = entry.Property(delPropName);
            delProp.CurrentValue = true;
            entry.State = System.Data.Entity.EntityState.Modified;
        }
    }
    return base.SaveChanges();
}

此处,entry.OriginalValues.PropertyNames用于检查实体中是否存在该属性,然后设置其值并将条目的状态更改为Modified。请注意,我在应用this.ChangeTracker.Entries()后循环遍历ToList(),否则集合的内容会在循环播放时发生变化。