gpt4 book ai didi

entity-framework-6 - DbContext的通用合并: how to check if entity is all ready attached?

转载 作者:行者123 更新时间:2023-12-04 04:25:16 25 4
gpt4 key购买 nike

给出以下代码:

    void MergeDbContext(DbContext aSourceDbContext, DbContext aDestinationDbContext)
{
var sourceEntities = aSourceDbContext.ChangeTracker.Entries().ToList();
foreach (DbEntityEntry entry in sourceEntities)
{
object entity = entry.Entity;
entry.State = EntityState.Detached;

// check if entity is all ready in aDestinationDbContext if not attach
bool isAttached = false;// TODO I don't know how to check if it is all ready attched.
if (!isAttached)
{
aDestinationDbContext.Set(entity.GetType()).Attach(entity);
}
}
}

我如何一般性地确定上下文中是否存在实体。

最佳答案

这是一种扩展方法,它通过以下步骤在上下文的状态管理器中查找对象:

  • 获取类型的键属性
  • 获取对象的键值
  • 检查上下文中是否存在任何具有对象类型和键值的实体。


  • public static bool IsAttached<T>(this DbContext context, T entity)
    where T : class
    {
    if (entity == null) return false;

    var oc = ((IObjectContextAdapter)context).ObjectContext;

    var type = ObjectContext.GetObjectType(entity.GetType());

    // Get key PropertyInfos
    var propertyInfos = oc.MetadataWorkspace
    .GetItems(DataSpace.CSpace).OfType<EntityType>()
    .Where(i => i.Name == type.Name)
    .SelectMany(i => i.KeyProperties)
    .Join(type.GetProperties(), ep => ep.Name, pi => pi.Name, (ep,pi) => pi);

    // Get key values
    var keyValues = propertyInfos.Select(pi => pi.GetValue(entity)).ToArray();

    // States to look for
    var states = System.Data.Entity.EntityState.Added|System.Data.Entity.EntityState.Modified
    |System.Data.Entity.EntityState.Unchanged|System.Data.Entity.EntityState.Deleted;

    // Check if there is an entity having these key values
    return oc.ObjectStateManager.GetObjectStateEntries(states)
    .Select(ose => ose.Entity).OfType<T>()
    .Any(t => propertyInfos.Select(i => i.GetValue(t))
    .SequenceEqual(keyValues));
    }

    用法:

    bool isAttached = dbContext.IsAttached(entity);

    关于entity-framework-6 - DbContext的通用合并: how to check if entity is all ready attached?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30577900/

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