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);
}
'IT박스' 카테고리의 다른 글
@ font-face 글꼴은 자체 도메인에서만 작동합니다. (0) | 2020.12.24 |
---|---|
Paypal IPN은 항상 샌드 박스에서 "payment_status : Pending"을 반환합니까? (0) | 2020.12.24 |
루비에서 문자열을 10 진수로 변환 (0) | 2020.12.24 |
Capybara 및 ChromeDriver를 사용하여 입력 필드에서 입력 입력을 시뮬레이션하려면 어떻게해야합니까? (0) | 2020.12.24 |
Adding padding to an UIView (0) | 2020.12.24 |