DbSet에는 EF7에서 Find 메서드가 없습니다.

c# entity-framework-core

문제

데이터베이스에 액세스하기 위해 일반 저장소를 만들려고합니다. EF6에서 특정 엔티티를 얻으려면이 작업을 수행 할 수있었습니다.

protected IDbSet<T> dbset;

public T Get(object id)
{
    return this.dbset.Find(id);
}

EF7의 DbSet에 Find 메서드가 없습니다. 위의 코드를 구현할 수있는 방법이 있습니까?

인기 답변

다음은 확장 메서드로 .Find() 를 구현 한 매우 조잡하고 불완전하며 테스트되지 않은 구현입니다. 그 밖의 것이 없다면 올바른 방향으로 향하게해야합니다.

실제 구현은 # 797에 의해 추적됩니다.

static TEntity Find<TEntity>(this DbSet<TEntity> set, params object[] keyValues)
    where TEntity : class
{
    var context = ((IAccessor<IServiceProvider>)set).Service.GetService<DbContext>();

    var entityType = context.Model.GetEntityType(typeof(TEntity));
    var key = entityType.GetPrimaryKey();

    var entries = context.ChangeTracker.Entries<TEntity>();

    var i = 0;
    foreach (var property in key.Properties)
    {
        var keyValue = keyValues[i];
        entries = entries.Where(e => e.Property(property.Name).CurrentValue == keyValue);
        i++;
    }

    var entry = entries.FirstOrDefault();
    if (entry != null)
    {
        // Return the local object if it exists.
        return entry.Entity;
    }

    // TODO: Build the real LINQ Expression
    // set.Where(x => x.Id == keyValues[0]);
    var parameter = Expression.Parameter(typeof(TEntity), "x");
    var query = set.Where((Expression<Func<TEntity, bool>>)
        Expression.Lambda(
            Expression.Equal(
                Expression.Property(parameter, "Id"),
                Expression.Constant(keyValues[0])),
            parameter));

    // Look in the database
    return query.FirstOrDefault();
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.