在edmx中创建和用户用户定义函数

时间:2012-03-28 07:16:50

标签: entity-framework linq-to-entities edmx

我想在edmx 中创建一个返回缩放器值的函数, 如何在SSDL中创建它以及如何在代码中访问它?

1 个答案:

答案 0 :(得分:0)

您遇到的一个问题是您的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知道此功能,但您的智能感知器不会受到影响。因此,您必须添加一些代码才能使其工作。最好将这些函数放在一个单独的类中。

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.");
    }
}

实体框架将知道将此函数调用重定向到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 )存储过程执行方法。