实体框架 6 混合存储过程和 SQL 查询生成

本文关键字:SQL 查询 存储过程 框架 混合 实体 | 更新日期: 2023-09-27 18:32:26

阅读 CodePlex 上的 EF 文档,我了解到目前无法同时使用存储过程和 SQL 查询生成来持久化域模型更改。

但是,我发现这令人沮丧的原因有很多,因为它的前身 - Linq 2 SQL 允许我这样做时,它不允许我混合使用两者。

我有一个复杂的方案,将我的域模型保存到数据库中的多个表,我想使用存储过程进行插入。 我不想使用存储过程进行更新的原因是,没有一种干净的方法可以只对那些受影响的列运行更新 - 将所有值解析到更新 sproc 我将不得不更新该记录的所有字段(除非我再次选择所有旧值进行比较或将这些字段包含在 UPDATE 语句谓词子句中 - 两种方式都有些混乱)。 这是一个问题,因为触发器附加到检查各个字段更新的表中,这更像是一个遗留系统问题 - 所以我们不会走使用触发器是一个好设计的主观问题的道路。

将所有

字段传递给更新 sproc 是不必要的,即使它们尚未更改,并且可能会增加网络流量,而 EF 知道在使用 SQL 查询生成模式时要显式更新哪些字段。

是否有任何实体框架加载项允许我混合使用存储过程映射进行插入,然后生成 SQL 查询以进行模型持久性更新?

对于我的数据库,我专门使用 SQL Server,但我相信合适的附加组件不会耦合到我选择的数据存储。

实体框架 6 混合存储过程和 SQL 查询生成

您可以调用存储过程(如果它已经在数据库中),也可以编写查询并执行它。

我目前不在带有视觉工作室的笔记本电脑上,但应该像这样工作:

  List<Ekipa> result = new List<Ekipa>();
        DataSet ds = new DataSet();
        using (UsersContext uc = new UsersContext())
        {
            using (SqlConnection con = new SqlConnection(uc.Database.Connection.ConnectionString))
            {
                con.Open();
                SqlCommand com = new SqlCommand("procedurename", con);
                com.CommandType = CommandType.StoredProcedure;
                 command.Parameters.AddWithValue("@id", 12);
                using (SqlDataAdapter da = new SqlDataAdapter(com))
                {
                    da.Fill(ds);
                }
            }
        }
        result = (from myRow in ds.Tables[0].AsEnumerable()
                  select new Ekipa()
                  {
                      UserId = myRow.Field<int>("UserId"),
                      UserName = myRow.Field<string>("UserName"),
                      Bodovi = myRow.Field<int>("Bod"),
                      OU = myRow.Field<int>("OU"),
                      Gol = myRow.Field<int>("PostignutiGolovi"),
                  }).ToList();

只需在配置中启用多个 MultipleActiveResultSets(多个活动结果集

<add name="DefaultConnection" connectionString="Data Source=**.**.***.***;Initial Catalog=**;User ID=**_DBUser; Password=***; MultipleActiveResultSets=true; " providerName="System.Data.SqlClient" />

我也在寻找这种混合物。 DbSet有一个名为SqlQuery的方法,您可以在其中放置自定义SELECT查询(带有一些警告)。您也可以调用商店程序。看看这个: https://msdn.microsoft.com/en-us/data/jj592907.aspx 显示此示例的位置:

using (var context = new BloggingContext()) 
{ 
    var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList(); 
}

我只是这样为自己使用它:

db.RegistroSet.SqlQuery("DELETE FROM RegistroSET; SELECT * FROM RegistroSet").ToList();
int c = db.RegistroSet.Count();

。因为我实际上想清除我的 200.000 行表。它很快,上下文还可以。但我必须包括对上下文完整性的Select。即使我没有得到结果,对ToList()的呼吁也很重要。