Рассмотрите следующий код, который звонит против сгенерированного контекста данных EF:
var context = new DataContext();
var employees = context.Employees.Include("Department");
Если я меняю имя отношений Отдела затем, этот код собирается начать бросать ошибку периода выполнения. Так есть ли какой-либо способ назвать.Include () методом безопасным способом, таким образом, я получаю время компиляции, проверяя на все ссылаемые отношения?
Я сделал небольшое расширение ObjectQuery, которое выглядит примерно так
public static ObjectQuery<TEntity> Include<TEntity, TProperty>(this ObjectQuery<TEntity> query, Expression<Func<TEntity, TProperty>> expression) where TEntity : class
{
string name = expression.GetPropertyName();
return query.Include(name);
}
, которое также требует
public static class ExpressionExtensions
{
public static string GetPropertyName<TObject, TProperty>(this Expression<Func<TObject, TProperty>> expression) where TObject : class
{
if (expression.Body.NodeType == ExpressionType.Call)
{
MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
string name = ExpressionExtensions.GetPropertyName(methodCallExpression);
return name.Substring(expression.Parameters[0].Name.Length + 1);
}
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
private static string GetPropertyName(MethodCallExpression expression)
{
MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
if (methodCallExpression != null)
{
return GetPropertyName(methodCallExpression);
}
return expression.Object.ToString();
}
}
, с которым вы можете сделать
var context = new DataContext();
var employees = context.Employees.Include(e => e.Department);
, который будет проверяться во время компиляции. Если я правильно помню, этот метод не работает для отношений "многие ко многим", но он работает для таких вещей, как
var item = context.Employees.Include(e => e.Department.Manager);
Удачи вам