IT박스

Entity Framework에 엔터티가 있는지 확인하는 일반적인 방법?

itboxs 2020. 12. 24. 23:28
반응형

Entity Framework에 엔터티가 있는지 확인하는 일반적인 방법?


Entity Framework에 개체가 있는지 확인 하는 가장 좋은 방법은 무엇입니까?

.NET Framework에서 엔터티를 확인하는 일반적인 방법을 찾고 DbSet있습니다. 작동하지 않는 다음과 같은 것 :

private DbContext DbContext { get; set; }

private DbSet<T> DbSet { get; set; }

public Boolean Exists(T entity) {
    return ((from item in this.DbSet
             where item == entity
             select item).Count() > 0);
}

이 라인 where item == entity은 LINQ to SQL에서 작동하지만 LINQ to Entities에서는 작동하지 않습니다. 엔티티가 다른 키를 가질 수 있기 때문에 비교를 위해 알려진 키를 사용하여 공통 추상에서 모두 상속받을 수는 없습니다.

나는 이것을 할 수 있지만, 검증 프로세스로서 예외를 잡는 성능이 걱정된다. 이것은 엔티티가 분리되어있는 한 OriginalValues속성을 얻을 수 없기 때문에 작동하지 않는다 .

public Boolean Exists(T entity) {
    try {
        var current = this.DbContext.Entry(entity).OriginalValues;
        // Won't reach this line if the entity isn't in the database yet
        return true;
    }
    catch (Exception ex) {
        return false;
    }
}

엔티티가 컨텍스트에 의해로드되었는지 확인하는 일반적인 방법 또는 엔티티가있는 경우 데이터베이스를 쿼리하는 일반적인 방법을 원하십니까?

전자의 경우 사용 :

public bool Exists<T>(T entity) where T: class
{
    return this.Set<T>().Local.Any(e => e == entity);
}

후자의 경우 사용 (로드 된 엔티티도 확인합니다) :

public bool Exists<T>(params object[] keys)
{
    return (this.Set<T>().Find(keys) != null);
}

편집하다:

EF 코드 먼저 이러한 종류의 정보에 액세스하도록되어 있지 않지만 엔터티 키의 이름을 가져올 수 있습니다. 나는 그와 같은 것이 효과가 있다고 생각합니다.

var objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var keyNames = objSet.EntitySet.ElementType.KeyMembers.Select(m => m.Name);

그러나이 모든 것은 말이되지 않습니다. 일반적인 접근 방식을 원하지만 엔터티가 일반적인 접근 방식을 허용하는 데 필요한 정보를 공유하지 않습니다. 이제 키 값도 모른다고합니다. 이 "일반적인"접근 방식을 사용하려면 표현 트리를 반영하고 수동으로 작성해야합니다.


나를 올바른 방향으로 안내 해준 @Ladislav에게 감사드립니다. 다음은 일반 Exists()메서드에 대한 코드입니다 .

이것은 반사가 필요하지 않고 꽤 잘 수행되는 것 같다는 점에 주목하고 싶습니다. 내가 흥분하지 않는 유일한 것은 TryGetObjectByKey()발견 된 엔티티를 첨부하는 부작용 이 있다는 것 입니다. Exists()의도하지 않은 결과를 원하지 않기 때문에 엔티티가 발견되면 분리해야합니다.

public Boolean Exists(T entity) {
    var objContext = ((IObjectContextAdapter)this.DbContext).ObjectContext;
    var objSet = objContext.CreateObjectSet<T>();
    var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);

    Object foundEntity;
    var exists = objContext.TryGetObjectByKey(entityKey, out foundEntity);
    // TryGetObjectByKey attaches a found entity
    // Detach it here to prevent side-effects
    if (exists) {
        objContext.Detach(foundEntity);
    }

    return (exists);
}

참조 URL : https://stackoverflow.com/questions/6018711/generic-way-to-check-if-entity-exists-in-entity-framework

반응형