Comment obtenir une valeur de clé primaire avec Entity Framework Core

entity-framework entity-framework-core primary-key repository-pattern

Question

Nous utilisons actuellement la méthode ci-dessous, qui dépend de IObjectContextAdapter dans un référentiel abstrait. D'après ce que je lis, il semble que tout ce qui concerne ObjectContext est éliminé d'Entity Framework Core. La méthode ci-dessous est le seul endroit où nous dépendons de tout ce qui concerne ObjectContext.

Nous aimerions passer à Entity Framework Core. C'est notre seul barrage routier. Existe-t-il un moyen d'obtenir la valeur de la clé primaire d'une entité avec l'apis Entity Framework Core?

// Entity Framework
public virtual int GetKey(T entity)
{
    var oContext = ((IObjectContextAdapter)_DbContext).ObjectContext;
    var oSet = oContext.CreateObjectSet<T>();
    var keyName = oSet.EntitySet.ElementType
                                .KeyMembers
                                .Select(k => k.Name)
                                .Single();

    return (int)entity.GetType().GetProperty(keyName).GetValue(entity, null);
}

Réponse acceptée

J'ai également fait face à un problème similaire et trouvé la solution suivante

// Entity Framework Core
public virtual int GetKey<T>(T entity)
{
    var keyName = Context.Model.FindEntityType(typeof (T)).FindPrimaryKey().Properties
        .Select(x => x.Name).Single();

    return (int)entity.GetType().GetProperty(keyName).GetValue(entity, null);
}

Réponse populaire

Selon la réponse de YuriyP, vous pouvez également obtenir des informations clés composites:

 public static class Extensions {

    public static IEnumerable<string> FindPrimaryKeyNames<T>(this DbContext dbContext, T entity) {
      return from p in dbContext.FindPrimaryKeyProperties(entity) 
             select p.Name;
    }

    public static IEnumerable<object> FindPrimaryKeyValues<T>(this DbContext dbContext, T entity) {
      return from p in dbContext.FindPrimaryKeyProperties(entity) 
             select entity.GetPropertyValue(p.Name);
    }

    static IReadOnlyList<IProperty> FindPrimaryKeyProperties<T>(this DbContext dbContext, T entity) {
      return dbContext.Model.FindEntityType(typeof(T)).FindPrimaryKey().Properties;
    }

    static object GetPropertyValue<T>(this T entity, string name) {
      return entity.GetType().GetProperty(name).GetValue(entity, null);
    }

  }

Ce qui pourrait alors être utilisé comme ceci:

var keyValues = context.FindPrimaryKeyValues(entity);    
var existingEntity = context.Set<TEntity>().Find(keyValues);


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi