2010-06-26 6 views
3

J'ai cette classe abstraite base qui implémente un modèle référentielComment puis-je récupérer par programme une clé primaire pour une entité (dans Entity Framework 4)?

public abstract class Repository<T> : IRepository<T> where T : class 
    { 
     private ObjectSet<T> _entitySet; 
     private ObjectContext _dataContext; 

     public Repository(ObjectContext context) 
     { 
      _dataContext = context; 
      _entitySet = _dataContext.CreateObjectSet<T>(); 
     } 

     public T FindByID(int id) 
     { 
      //?????? 

     } 
    } 

Maintenant, je dois savoir la colonne de clé primaire (propriété correspondant) à mettre en œuvre la méthode FyndByID.

Proposer cette clé priamry est pas composite et il est le type de données est int

+0

-t-il être base de données agnostique, ou sera une version spécifique SQL-Serveur travail pour vous? –

+0

Spécifique au serveur SQl – VoimiX

Répondre

0

Une propriété clé d'une classe d'entité est marquée avec cet attribut:

[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 

Notez que le EntityKeyProperty est réglé à true. Trouver cet attribut pour la propriété avec cet attribut pour le type T et comparer sa valeur avec le passé id:

//Property that holds the key value 
PropertyInfo p = typeof(T). 
GetProperties().FirstOrDefault(
    x => x.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false) 
      .OfType<EdmScalarPropertyAttribute>() 
      .Where(y => y.EntityKeyProperty == true) 
      .Count() > 0); 

//Return first item having the passed id or null 
return _entitySet.FirstOrDefault(x => (int)p.GetValue(x, null) == id); 
+0

p = null Quelque chose ne va pas ... – VoimiX

+0

Votre classe de type T a-t-elle été générée par le framework d'entité? – Simon

+0

Bien sûr, http://xmages.net/storage/10/1/0/9/3/upload/8ed7e7e1.jpg – VoimiX

Questions connexes