У меня есть класс, содержащий несколько частных / защищенных полей и несколько общедоступных методов получения, которые возвращают значения полей. Я пытаюсь сопоставить поля со столбцами базы данных, используя свободный API на DbModelBinder в OnModelCreating. Я не могу использовать автоматическое свойство с защищенным сеттером, поэтому, пожалуйста, не предлагайте это как решение моего вопроса. Наверное, сработает я ' Я уверен, но я не могу использовать автоматическое свойство, поскольку класс домена является общим кодом и используется с другими разными ORM, которые имеют разные способы сопоставления своих полей, и, к сожалению, один не поддерживает au
. Я использую следующий код (найден на stackoverflow) для доступа к защищенному полю, чтобы я мог использовать выражение при сопоставлении:
public static class ObjectAccessor<T>
where T : class
{
public static Expression<Func<T, TResult>> CreateExpression<TResult>(string propertyOrFieldName)
{
ParameterExpression param = Expression.Parameter(typeof(T), "propertyOrFieldContainer");
Expression body = Expression.PropertyOrField(param, propertyOrFieldName);
LambdaExpression lambda = Expression.Lambda(typeof(Func<T, TResult>), body, param);
return (Expression<Func<T, TResult>>)lambda;
}
}
Все это прекрасно работает, если имя поля - m_username, но если я использую _username, я получаю ModelValidationException: одна или несколько ошибок проверки были обнаружены во время создания модели : System.Data.Edm.EdmProperty: Name: Указанное имя недопустимо: '_username'.
Я не могу использовать camelcase без подчеркивания, так как приведенный выше помощник не может различить общедоступное свойство Username и защищенное поле имени пользователя. Я' Я действительно хотел бы по-прежнему использовать верблюжий регистр подчеркивания без буквенного префикса.
Можно ли каким-либо образом настроить ModelBinder, чтобы при проверке имя свойства принималось с начальным подчеркиванием?
Заранее спасибо,
] Mark