Ich versuche, ein generisches Repository für den Zugriff auf meine Datenbank zu erstellen. In EF6 konnte ich das tun, um eine bestimmte Entität zu erhalten:
protected IDbSet<T> dbset;
public T Get(object id)
{
return this.dbset.Find(id);
}
DbSet in EF7 fehlt eine Find-Methode. Gibt es eine Möglichkeit, den obigen Code zu implementieren?
Hier ist eine sehr grobe, unvollständige und ungetestete Implementierung von .Find()
als Erweiterungsmethode. Wenn nichts anderes, sollte es dich in die richtige Richtung weisen.
Die tatsächliche Implementierung wird von # 797 verfolgt .
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();
}