DbSet doesn't have a Find method in EF7

后端 未结 11 1765
醉话见心
醉话见心 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条回答
  •  Happy的楠姐
    2020-12-03 04:45

    I've taken some of the previously provided answers and tweaked them to fix a couple of problems:

    • Implicitly captured closure
    • Key shouldn't be hard coded to "Id"

      public static TEntity Find(this DbSet set, params object[] keyValues) where TEntity : class
      {
          var context = set.GetService();
      
          var entityType = context.Model.FindEntityType(typeof(TEntity));
          var key = entityType.FindPrimaryKey();
      
          var entries = context.ChangeTracker.Entries();
      
          var i = 0;
          foreach (var property in key.Properties)
          {
              var i1 = i;
              entries = entries.Where(e => e.Property(property.Name).CurrentValue == keyValues[i1]);
              i++;
          }
      
          var entry = entries.FirstOrDefault();
          if (entry != null)
          {
              // Return the local object if it exists.
              return entry.Entity;
          }
      
          var parameter = Expression.Parameter(typeof(TEntity), "x");
          var query = set.AsQueryable();
          i = 0;
          foreach (var property in key.Properties)
          {
              var i1 = i;
              query = query.Where((Expression>)
               Expression.Lambda(
                   Expression.Equal(
                       Expression.Property(parameter, property.Name),
                       Expression.Constant(keyValues[i1])),
                   parameter));
              i++;
          }
      
          // Look in the database
          return query.FirstOrDefault();
      }
      

提交回复
热议问题