【发布时间】: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