我有一个存储过程返回一个表(或数据集或视图或其调用的任何内容,它返回select
的结果)。我使用实体框架,我希望它通过创建实体来像处理表一样处理存储过程。当我将proc添加到实体模式时,它被添加但没有生成类(模式或智能感知中没有任何内容)。
我不想使用看起来丑陋且未经优化的数据集解决方案:
SqlCommand sqlCommand = new SqlCommand("sp_ProjetsVoxco");
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Connection = new SqlConnection(
Settings.Default.ConnectionStringTransit);
SqlDataAdapter sa = new SqlDataAdapter(sqlCommand);
DataSet dataSet = new DataSet();
sa.Fill(dataSet);
我找到了一条看似非常整洁的线条:
var x = context.ExecuteStoreQuery<T>("sp_ProjetsVoxco");
但是由于实体框架没有生成一个类,我不确定如何处理T
。
答案 0 :(得分:4)
向模型添加存储过程是不够的。您还必须添加function import。函数导入是将存储过程映射到上下文中的方法(应该为您生成该方法)。在此映射中,您可以将结果映射到现有实体,复杂类型或定义新的复杂类型。
ExecuteStoreQuery
与导入的存储过程无关。它用于直接执行SQL(=主要是避免EF),T
必须是您的自定义类型,它具有与存储过程返回的结果集相同名称的公共可设置属性。
答案 1 :(得分:3)
我假设您拥有edmx
文件,并且您现在正在尝试添加已在数据库中创建的存储过程。
1 - 您应该通过使用从数据库更新模型选项添加它来添加商店过程,这将使EF了解SP。 (因为我已经有了我的SP,我正在显示Refresh
标签,但如果您尚未添加它们,则会在Add
标签中看到您的SP。
2 - 导入功能
3 - 为其添加名称并创建新的复杂类型
4 - 点击确定并使用新方法名称
public IEnumerable<mySPMethodCallName_Result> ListAllServiceLogsFromSP(decimal clientId)
{
var r = from sp in db.sp_ListServiceLogsByClientId(clientId)
select sp;
return r;
}