我想在edmx 中创建一个返回缩放器值的函数, 如何在SSDL中创建它以及如何在代码中访问它?
答案 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
)
存储过程执行方法。