【问题标题】:Insert SP in EF Core在 EF Core 中插入 SP
【发布时间】:2020-08-10 10:31:49
【问题描述】:

我使用 EF Core 作为我的 ORM。理想情况下,我会使用 SaveChanges/SaveChangesAsync 将数据插入到我的数据库中,但在某些情况下,我的表没有 PK,我也无法创建它,甚至没有复合键。所以我决定写一个 Merge SP 并使用 FromSQL 调用它。

我的问题是,是否可以创建一个合并 SP 的函数,这是我们过去在 EF 中所做的事情,这将使我能够将我的类 obj 传递到我的合并函数中,而不是将所有值作为参数传递。

任何帮助将不胜感激..干杯!!

【问题讨论】:

    标签: .net-core ef-core-3.0


    【解决方案1】:

    通常我在我正在使用的 DbContext 类中为我的 SP 创建一个包装器。例如:

    // Table already created in the DBContext class
    public DbQuery<Data> TblData { get; set; }
    
    public void SpInsertData(Data data)
    {
        TblData.FromSqlInterpolated("exec [dbo].[sp_InsertData] {data.A}, {data.B}, {data.C}");
    }
    

    这样我只需要写一次参数列表。


    如果你甚至不想写下属性列表一次,你可以使用反射来获取属性值。你可以在你的类上写一个函数,返回数组中的每个属性值(使用this question's answer):

    class Data
    {
        public int A{ get; }
        public string B{ get; }
        public bool C{ get; }
    
        public string[] GetAllPropertyValues()
        {
            List<string> values = new List<string>();
            foreach (var pi in typeof(MyType).GetProperties())
            {
                values.Add(pi.GetValue(this, null).ToString());
            }
    
            return values.ToArray();
        }
    }
    

    有了这个,你可以在不列出属性值的情况下编写对 SP 的先前调用:

    public DbQuery<Data> TblData { get; set; }
    
    public void SpInsertData(Data data)
    {
        TblData.FromSqlRaw("exec [dbo].[sp_InsertData]", data.GetAllPropertyValues());
    }
    

    但是,我不建议您使用这种方法,因为它会导致许多无声错误:即使属性的 顺序 发生变化(无论是在代码或在 SP 中),您可以将数据插入错误的列,如果类型正确,您将不会收到有关它的错误。列出这些属性会更安全,只需要做一次,以后不会出错。

    【讨论】:

    • 我正在寻找类似的东西,唯一的问题是我有一个很长的参数列表,所以我正在寻找一种方法,如果可以在不列出所有参数的情况下实现这一点。一个内置函数什么的。
    • 我在回答中添加了另一个想法。但是,我认为您的主要目标是尽一切努力向表中添加主键,因为这是设计中的一个根本缺陷,每一个试图解决这个问题的解决方案只会让未来的错误更有可能发生。跨度>
    • 我知道添加 PK 本来是最好的解决方案,但我拥有的是一个暂存数据库,所以按照设计它保持这样,我现在不能更改 ORM :)
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多