2010-11-23 9 views
0

J'utilise Entity Framework version 1 et j'essaie de créer un référentiel générique, mais je n'arrive pas à trouver un moyen d'obtenir la clé primaire de chaque table. Est-ce que quelqu'un a résolu ce problème?Entity Framework: Référentiel générique et clés primaires de table

MISE À JOUR: Mon utilisation cible pour ce serait une méthode générique qui ressemble à ceci:

TModel GetByPrimaryKey(Guid key) 
{ 

} 

Répondre

3

En fin de compte, je me suis adapté @ réponse de Marc d'ici: C# Linq-SQL: An UpdateByID method for the Repository Pattern

Le résultat est quelque chose comme ceci:

public TModel GetByPrimaryKey(Guid key) 
    { 
     // get the row from the database using the meta-model 
     MetaType meta = _DB.Mapping.GetTable(typeof(TModel)).RowType; 
     if (meta.IdentityMembers.Count != 1) throw new InvalidOperationException("Composite identity not supported"); 
     string idName = meta.IdentityMembers[0].Member.Name; 

     var param = Expression.Parameter(typeof(TModel), "row"); 
     var lambda = Expression.Lambda<Func<TModel, bool>>(
      Expression.Equal(
       Expression.PropertyOrField(param, idName), 
       Expression.Constant(key, typeof(Guid))), param); 

     return _DB.GetTable<TModel>().FirstOrDefault(lambda); 
    } 

... où _DB est un DataContext.

J'espère que cela aidera quelqu'un dans le futur.

0

Vous devez utiliser une sorte de réflexion.

Essayez quelque chose comme ceci:

private PropertyInfo GetPrimaryKeyInfo<T>() 
{ 
    PropertyInfo[] properties = typeof(T).GetProperties(); 
    foreach (PropertyInfo pI in properties) 
    { 
     System.Object[] attributes = pI.GetCustomAttributes(true); 
     foreach (object attribute in attributes) 
     { 
      if (attribute is EdmScalarPropertyAttribute) 
      { 
       if ((attribute as EdmScalarPropertyAttribute).EntityKeyProperty == true) 
        return pI; 
      } 
      else if (attribute is ColumnAttribute) 
      { 

       if ((attribute as ColumnAttribute).IsPrimaryKey == true) 
        return pI; 
      } 
     } 
    } 
    return null; 
} 
+0

merci - J'aurais dû être plus clair depuis le début. Mon objectif est d'utiliser cette information dans une méthode générique "getbyprimarykey". J'ai mis à jour la question. – Remus

+0

@Remus - vérifiez cette réponse SO: http://stackoverflow.com/questions/2958921/entity-framework-4-how-to-find-the-primary-key/3046102#3046102 Pas sûr à 100% si elle le sera travailler avec EF1 cependant. – RPM1984

+0

qui aide. J'ai remarqué que le lien que vous m'avez envoyé utilise un OjbectContext alors que j'ai un DataContext. Des indications sur le portage de la solution au modèle VS généré qui utilise un DataContext? – Remus