2016-11-04 81 views
5

我试图移植一个ASP.NET 4.5应用程序到.NET核心,我有一个真正的问题,我似乎无法弄清楚。.NET核心实体框架存储过程

我现有的应用程序执行存储过程,它返回一个包含多个数据表的数据集。实体框架可以自动将返回的字段映射到我的实体属性,但仅适用于数据集中的第一个数据表(自然地)。

所以我只是想弄清楚它是否有可能以某种方式拦截模型构建过程并使用自定义代码来处理数据集并查看其他数据表来设置实体字段。

我知道我可以使用直接使用SqlConnection执行存储过程的正常方式,但我想知道实体框架是否有办法做到这一点。

+0

也许这个回答有用吗? http://stackoverflow.com/a/9987939/968301 –

+0

所以我只注意到DataTable和DataSet以及他们所有的朋友在.NET Core中都不被支持,因为它们被认为是遗留的。所以我必须改用DbReader。我在这个假设中纠正了吗? – DKhanaf

+0

我认为你可以这样执行你的存储过程:'dbContext.TableName.FromSql(“stored_proc”)'我不知道这是否会映射你的其他表中的所有字段。 –

回答

10

此刻,the way to execute stored procedures表示返回数据是使用DbSet.FromSql方法。

using (var context = new SampleContext()) 
{ 
    var data= context.MyEntity 
     .FromSql("EXEC GetData") 
     .ToList(); 
} 

这有一定的局限性:

  • 必须叫上一个DbSet
  • 返回的数据必须映射到所有属性的DbSet
  • 它不支持ad hoc对象。

或者你可以回落到普通ADO.NET:

using (var context = new SampleContext()) 
using (var command = context.Database.GetDbConnection().CreateCommand()) 
{ 
    command.CommandText = "GetData"; 
    command.CommandType = CommandType.StoredProcedure; 
    context.Database.OpenConnection(); 
    using (var result = command.ExecuteReader()) 
    { 
     // do something with result 
    } 
} 

plans to introduce support for returning ad hoc types从在某个阶段SQL查询。

+0

这就是我从所做的所有研究中得出的结论。解决我的问题的一种方法是引入一个DAO对象,该对象具有映射到存储过程返回的所有字段的属性。然后使用可能的隐式转换将DAO转换为我的业务对象,并应用所有必要的逻辑来转换字段等。 – DKhanaf

+0

剩余的一个问题是存储过程返回的多个数据集。只有这样,我可以解决的办法是将storedproc拆分为两个并分别调用它们,然后遵循上面的DAO模式,并在服务层将DAO合并到我的业务对象中。这可能是低效率,因为我现在正在做两个调用而不是一个调用,但以一种更清晰和更可读的方式。 – DKhanaf

0

要回答@Dakhanaf的问题与多个数据集,您可以使用SqlDataAdapter填充所有结果集的DataSet对象。尽管SqlDataAdapter需要完整的.NET Framework,所以你必须运行.NETCore项目,同时瞄准.NET 462或类似的东西。

  using (var context = new SampleContext()) 
      using (var command = context.Database.GetDbConnection().CreateCommand()) 
      { 
       command.CommandText = "GetData"; 
       command.CommandType = CommandType.StoredProcedure; 
       context.Database.OpenConnection(); 
       using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
       { 
        var ds = new DataSet(); 
        adapter.Fill(ds); 
        return ds; 
       } 

      } 
     }