У меня есть класс, который содержит несколько частных/защищенных полей и некоторые общедоступные геттеры, которые возвращают значение полей. Я пытаюсь сопоставить поля столбцам базы данных, используя свободный 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 без подчеркивания, так как помощник выше не может различать свойство публичного имени и защищенное имя пользователя. Мне бы очень хотелось, чтобы я продолжал использовать липучку с подчеркиванием без префикса письма.
Можно ли каким-либо образом сконфигурировать ModelBinder так, чтобы проверка принимала имя свойства с лидирующим знаком подчеркивания?
Спасибо заранее,
Марк