DbSet doesn't have a Find method in EF7

后端 未结 11 1778
醉话见心
醉话见心 2020-12-03 04:28

I am trying to create a generic repository to access my database. In EF6 I was able to do that in order to get a specific entity:

protected IDbSet d         


        
11条回答
  •  感动是毒
    2020-12-03 04:53

    Here's a very crude, incomplete, and untested implementation of .Find() as an extension method. If nothing else, it should get you pointed in the right direction.

    The real implementation is tracked by #797.

    static TEntity Find(this DbSet set, params object[] keyValues)
        where TEntity : class
    {
        var context = ((IAccessor)set).Service.GetService();
    
        var entityType = context.Model.GetEntityType(typeof(TEntity));
        var key = entityType.GetPrimaryKey();
    
        var entries = context.ChangeTracker.Entries();
    
        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>)
            Expression.Lambda(
                Expression.Equal(
                    Expression.Property(parameter, "Id"),
                    Expression.Constant(keyValues[0])),
                parameter));
    
        // Look in the database
        return query.FirstOrDefault();
    }
    

提交回复
热议问题