Entity Framework: где я могу расширить CSDL / MSL? - PullRequest
18 голосов
/ 10 апреля 2011

Я использую Entity Framework 4. Я использую первую модель базы данных, что означает, что я сгенерировал EDM из базы данных.Теперь я хочу добавить некоторые определяемые моделью функции.У меня вопрос ... где?

Если я помещу их в файл .edmx, не будут ли все мои добавления перекрыты при следующем обновлении базы данных и создании нового EDM?Я имею в виду, что прямо в верхней части файла .Designer.cs написано: «Ручные изменения этого файла будут перезаписаны при повторном создании кода».

Итак, в какой файл я добавлю свои дополнения

1 Ответ

35 голосов
/ 10 апреля 2011

Я расскажу об этом немного глубже, потому что определяемые моделью функции не очень хорошо известны.

Определенные моделью функции должны быть вручную добавлены в CSDL-часть файла EDMX.Вы должны открыть файл в формате XML и добавить функцию.Например, эта функция, определенная моделью, может выдавать полное имя сотрудника:

<Function Name="FullName" ReturnType="Edm.String">
  <Parameter Name="emp" Type="TestModel.Employee" />
  <DefiningExpression>
    Trim(emp.FirstName) + " " + Trim(emp.LastName)
  </DefiningExpression>
</Function>

Теперь вы можете сохранить свой EDMX и вернуться к конструктору.Функция все еще будет присутствовать, но она не видна в браузере модели.Вы можете обновить свою модель из базы данных или удалить все свои объекты, но функция все равно будет определена.EF не удаляет пользовательские изменения в CSDL-части EDMX.

Теперь вам нужно определить функцию .NET, чтобы использовать эту функцию, определенную моделью.Вы можете сделать это где угодно.Одним из способов является использование частичного класса для контекста, но в то же время вы можете просто использовать некоторый класс cutom:

public static class EdmFunctions
{
    [EdmFunction("TestModel", "FullName")]
    public static string FullName(Employee e)
    {
        throw new NotSupportedException("This function is only for L2E query.");
    }
}

И все готово.Единственной оставшейся задачей является использование функции в запросе Linq-to-entity:

using (var context = new TestEntities())
{
    var query = from e in context.Employees
                select new
                    {
                        e.Id,
                        FullName = EdmFunctions.FullName(e)
                    };
    var data = query.ToList();
    ...
}

Функции, определяемые моделью, - это просто некий повторно используемый Entity SQL, который переводится в SQL, поэтому их можно использовать только в Linq-to-entity.запросы сущностей.Определенные моделью функции могут быть намного более сложными.

...