Подтвердить что ты не робот

Entity Framework: Где я могу расширить CSDL/MSL?

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

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

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

4b9b3361

Ответ 1

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

Определенные функции должны быть добавлены вручную в 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-entities:

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. Определенные функции могут быть намного сложнее.