Создание и пользовательская функция определения пользователя в edmx - PullRequest
1 голос
/ 28 марта 2012

я хочу создать одну функцию в edmx , которая возвращает значение масштабатора, как создать его в SSDL и как получить к нему доступ в коде?

1 Ответ

0 голосов
/ 28 марта 2012

Одна из проблем, с которой вы столкнулись, заключается в том, что ваш SSDL автоматически генерируется EntityModelGenerator, поэтому его редактирование будет стерто при перестроении.Ваши изменения должны быть сделаны в файле EDMX.

Итак, во-первых, вы должны решить, является ли (1) ваше возвращаемое значение вычислением сортировки (т.е. добавление значений вместе в приложении, а не на уровне базы данных)или (2) это прямой вызов хранимой процедуры базы данных?

(1) Первый шаг - добавить определение XML функции в ваш файл EDMX:

<Function Name="LineTotal" ReturnType="decimal">
  <Parameter Name="lineTotal" Type="MyDbModel.OrderDetail">
    <DefiningExpression> 
      od.Price * od.Quantity 
    </DefiningExpression>
  </Parameter>
</Function>

Теперь,хотя ваш EDMX знает об этой функции, ваш IntelliSense не будет.Таким образом, вы должны добавить код, чтобы сделать эту работу.Рекомендуется размещать эти функции в отдельном классе.

public class ModelDefinedFunctions
{
    [EdmFunction("MyDbModel" , "LineTotal")] //Model Name and Function Name
    public static decimal LineTotal(OrderDetail od)
    {
        throw new NotSupportedException("LineTotal cannot be directly used.");
    }
}

Entity Framework будет знать, что вместо этого следует перенаправить этот вызов функции в EDMX.Любой прямой вызов этого метода, где модель не существует, вызовет исключение.

Затем вы можете вызвать его в запросах LINQ, например

var productValues = from line in model.OrderDetails
                    select new 
                    {
                      od.ProductID, 
                      od.Price, 
                      od.Quantity, 
                      LineTotal = ModeDefinedFunctions.LineTotal(line)
                    };

(2) Если вы добавляетехранимой процедуры напрямую, ее проще перетащить в дизайнер EDMX.Существует атрибут [FunctionImport ()], но я его не использовал.Вы можете перетащить и посмотреть, какой код он генерирует в файле EDMX?

Кроме того, вы можете вызвать model.ExecuteCommand(<spname> , params object[] values ) метод выполнения хранимой процедуры.

...