2010-11-23 3 views
0

Я использую Entity Framework версии 1, и я пытаюсь создать общий репозиторий, но я не могу найти способ получить первичный ключ каждой таблицы. Кто-нибудь решил эту проблему?Entity Framework: основные репозитории и основные ключи таблицы

UPDATE: Моя цель использовать для этого было бы для общего метода, который выглядит следующим образом:

TModel GetByPrimaryKey(Guid key) 
{ 

} 

ответ

3

В конце концов, я приспособил @ ответ Марка, отсюда: C# Linq-SQL: An UpdateByID method for the Repository Pattern

В результате получается нечто вроде этого:

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); 
    } 

... где _DB - DataContext.

Я надеюсь, что это поможет кому-то в будущем.

0

Вы должны использовать какой-то отражение.

попробовать что-то вроде этого:

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

спасибо - я должен был быть яснее с самого начала. Моя цель - использовать эту информацию в универсальном методе getbyprimarykey. Я обновил вопрос. – Remus 2010-11-23 01:09:05

Смежные вопросы