Я использую некоторый код из книги для реализации универсального класса репозитория для доступа к данным EF. код использует следующие два метода для получения одной сущности по ее первичному ключу int id
, предполагая, что все объекты БД имеют int PK. Тем не менее, я использую импортированную БД с в основном натуральными ключами, и я хочу сохранить все отношения FK, как они есть, то есть я не хочу перепроектировать БД для использования одного столбца int PK.
Как адаптировать приведенный ниже код для работы с многостолбцовыми ключами?
protected Expression<Func<T, bool>> CreateGetExpression<T>(int id)
{
ParameterExpression e = Expression.Parameter(typeof(T), "e");
PropertyInfo propInfo = typeof(T).GetProperty(KeyPropertyName);
MemberExpression m = Expression.MakeMemberAccess(e, propInfo);
ConstantExpression c = Expression.Constant(id, typeof(int));
BinaryExpression b = Expression.Equal(m, c);
Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(b, e);
return lambda;
}
public override T Get<T>(int id)
{
return List<T>().FirstOrDefault(CreateGetExpression<T>(id));
}
Я хочу, чтобы мой Get
метод выглядел так:
public override T Get<T>(params object[] keyValues)
{
return List<T>().FirstOrDefault(CreateGetExpression<T>(keyValues));
}