Entity Framework: универсальный репозиторий и первичные ключи таблиц - PullRequest
0 голосов
/ 23 ноября 2010

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

ОБНОВЛЕНИЕ: мое целевое использование этого было бы для универсального метода, который похож на это:

TModel GetByPrimaryKey(Guid key)
{

}

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

В конце я адаптировал ответ @ Marc отсюда: C # Linq-SQL: метод UpdateByID для шаблона репозитория

Результат примерно такой:

    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 голосов
/ 23 ноября 2010

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

Попробуйте что-то вроде этого:

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