【问题标题】:C# Entity Framework and stored proceduresC# 实体框架和存储过程
【发布时间】:2018-07-20 16:56:48
【问题描述】:

我用它的存储过程创建了我的数据库,然后将它与我的项目实体框架数据库附加在一起。

此函数用于插入公司信息并返回其 id 并将其插入到与公司表相关的另一个表中

public string InsertCompany(company company, out int index)
{
        try
        {
            using (vendors_managerEntities db = new vendors_managerEntities())
            {
                db.companies.Add(company);
                db.SaveChanges();
                index = company.id_company;
                return $"{company.name_company} Is Saved";
            }
        }
        catch (Exception ex)
        {
            index = 0;
            return ex.Message;
        }
}

但是当我尝试使用在数据库中创建的存储过程时,我无法返回任何 id 始终为 0 的值

public string InsertCompany(company company, out int index)
{
        try
        {
            using (vendors_managerEntities db = new vendors_managerEntities())
            {
                db.SP_insert_companies(company.name_company, company.website_company, company.adress_company, company.county_company, company.decription_company);
                index = company.id_company;
                return $"{company.name_company} Is Saved";
            }
        }
        catch (Exception ex)
        {
            index = 0;
            return ex.Message;
        }
}

我读到我可以在 SQL 中创建它,但我正在寻找 C# 中的解决方案,所以我在 C# 中打开存储过程定义并找到以下代码,并在考虑是否可以更改它的返回值,因为它不是返回id值

public virtual int SP_insert_companies(string name, string website, string address, string country, string description)
{
        var nameParameter = name != null ?
            new ObjectParameter("name", name) :
            new ObjectParameter("name", typeof(string));

        var websiteParameter = website != null ?
            new ObjectParameter("website", website) :
            new ObjectParameter("website", typeof(string));

        var addressParameter = address != null ?
            new ObjectParameter("address", address) :
            new ObjectParameter("address", typeof(string));

        var countryParameter = country != null ?
            new ObjectParameter("country", country) :
            new ObjectParameter("country", typeof(string));

        var descriptionParameter = description != null ?
            new ObjectParameter("description", description) :
            new ObjectParameter("description", typeof(string));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SP_insert_companies", nameParameter, websiteParameter, addressParameter, countryParameter, descriptionParameter);
}

请告诉我在 C# 中是否有解决方案,或者在这种情况下我应该回到没有存储过程的旧代码吗?

【问题讨论】:

  • 只是看了一眼,我注意到的第一件事就是您正在返回 ex.Message 并且您最后几行代码的索引设置为 0.. 这是一个错字吗?
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 您使用一些字符串值调用存储过程。那 company.id_company 应该如何更新?我不认为EF可以看到两者之间的关系
  • 将异常作为字符串返回是不好的做法...而不是抛出异常并使用结构化错误处理
  • @HansKesting id_company 应该创建 auto,因为它是 IDENTITY(1,1) 在数据库中

标签: c# stored-procedures entity-framework-6


【解决方案1】:

问题是您正在使用存储过程插入company 实体,我怀疑这不会导致对象被上下文刷新:

db.SP_insert_companies(company.name_company, company.website_company, company.adress_company, company.county_company, company.decription_company);

然后您尝试从 0 对象中获取 id,因为它尚未刷新:

index = company.id_company;

如果您坚持使用存储过程,我建议您让 SP 返回公司的 id,然后从调用中获取它并将其用作 index 的值:

index = db.SP_insert_companies(company.name_company, company.website_company, company.adress_company, company.county_company, company.decription_company);

一旦您修改了 SP,请确保更新代码中的定义,以便它知道创建一个返回值的函数。

如果您希望将它放在对象本身中,请确保手动更新它,尽管我不建议这样做,因为该对象与数据库没有真正同步:

index = db.SP_insert_companies(company.name_company, company.website_company, company.adress_company, company.county_company, company.decription_company);
company.id_company = index;

【讨论】:

    【解决方案2】:

    根据您所说的,它会自动进入“Catch”,然后索引已设置为 0。因此,您的代码可能会在其他地方(未列出)搞砸了。我怀疑您保存公司信息的代码没有正确保存。尝试手动将公司输入数据库,然后使用您的程序进行检查。如果它返回它是“已保存”,那么您知道您的问题不在此方法中,而是您的保存方法的结果。

    【讨论】:

    • 我的数据库工作正常,正如我上面所说,我可以使用 db.companies.add(company); 在索引中捕获 id;但是对于商店生产者,我无法获取 id
    猜你喜欢
    • 2013-03-19
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多