是否有可能在EF中使用存儲過程返回像傳統ADO.net中的原始DataTable/DataSet,而不是返回映射/轉換的實體?實體框架:使用存儲過程返回原始表結果
1
A
回答
1
EF構建於ADO.NET基礎之上,所以無論何時您需要直接訪問DbConnection以獲取DbContext並直接使用它。例如
using (var db = new MyDbContext())
{
db.Database.Connection.Open();
var con = (SqlConnection)db.Database.Connection;
var cmd = new SqlCommand("exec MyProc", con);
DataTable dt = new DataTable();
using (var rdr = cmd.ExecuteReader())
{
dt.Load(rdr);
}
//. . .
0
是的,這是可能的。
下面我描述了我是如何做到這一點的。存儲過程是數據庫的一部分。因此,最好將存儲過程添加到訪問數據庫的類並創建數據庫模型:dbContext。
public class MyDbContext : DbContext
{
// TODO: add DbSet properties
#region stored procedures
// TODO (1): add a function that calls the stored procedure
// TODO (2): add a function to check if the stored procedure exists
// TODO (3): add a function that creates the stored procedure
// TODO (4): make sure the stored procedure is created when the database is created
#endregion stored procedure
}
TODO(1):過程調用存儲過程:
private const string MyStoredProcedureName = ...;
private const string myParamName1 = ...;
private const string myParamName2 = ...;
public void CallMyStoredProcedure(MyParameters parameters)
{
object[] functionParameters = new object[]
{
new SqlParameter(myParamName1, parameters.GetParam1Value(),
new SqlParameter(myParamName2, parameters.GetParam2Value(),
... // if needed add more parameters
};
const string sqlCommand = @"Exec " + MyStoredProcedureName
+ " @" + myParamName1
+ ", @" + myParamName2
... // if needed add more parameters
;
this.Database.ExecutSqlCommand(sqlComman, functionParameters);
}
TODO(2)檢查存儲過程存在
// returns true if MyStoredProcedure exists
public bool MyStoredProcedureExists()
{
return this.ProcedureExists(MyStoredProcedureName);
}
// returns true if stored procedure with procedureName exists
public bool StoredProcedureExists(string procedureName)
{
object[] functionParameters = new object[]
{
new SqlParameter(@"procedurename", procedureName),
};
string query = @"select [name] from sys.procedures where name= @procedurename";
return this.Database.SqlQuery<string>(query, functionParameters)
.AsEnumerable() // bring to local memory
.Where(item => item == procedureName) // take only the procedures with desired name
.Any(); // true if there is such a procedure
}
TODO(3 )創建存儲過程:
public void CreateProcedureUpdateUsageCosts(bool forceRecreate)
{
bool storedProcedureExists = this.MyStoredProcedureExists();
// only create (or update) if not exists or if forceRecreate:
if (!storedProcedureExists || forceRecreate)
{ // create or alter:
Debug.WriteLine("Create stored procedures");
// use a StringBuilder to create the SQL command that will create the
// stored procedure
var x = new StringBuilder();
// ALTER or CREATE?
if (!storedProcedureExists)
{
x.Append(@"CREATE");
}
else
{
x.Append(@"ALTER");
}
// procedure name:
x.Append(@" procedure ");
x.AppendLine(MyStoredProcedureName);
// parameters: (only as an example)
x.AppendLine(@"@ReportPeriod int,");
x.AppendLine(@"@CustomerContractId bigint,");
x.AppendLine(@"@CallType nvarChar(80),");
// etc.
// code
x.AppendLine(@"as");
x.AppendLine(@"begin");
// only as example some of my procedure
x.AppendLine(@"Merge [usagecosts]");
x.AppendLine(@"Using (Select @ReportPeriod as reportperiod,");
x.AppendLine(@" @CustomerContractId as customercontractId,");
...
x.AppendLine(@"end");
// execute the created SQL command
this.Database.ExecuteSqlCommand(x.ToString());
}
}
TODO(4)確保創建
當數據庫在MyDbContext創建存儲過程:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// TODO: if needed add fluent Api to build model
// create stored procedure
this.CreateProcedureUpdateUsageCosts(true);
}
用法:
using (var dbContext = new MyDbContext(...))
{
MyParameters parms = FillMyParameters();
dbContext.CallMyStoredProcedure(parms);
}
相關問題
- 1. 實體框架與返回實體的'獲取'存儲過程
- 2. 實體框架存儲過程結果到域模型
- 3. 實體框架7存儲過程結果到模型
- 4. 實體框架4.0 - 函數導入 - 存儲過程結果集
- 5. 具有多個結果集的實體框架存儲過程?
- 6. 實體框架存儲過程結果映射
- 7. 實體框架3.5和存儲過程結果映射
- 8. 實體框架:在存儲過程後返回空值
- 9. 實體框架4存儲過程返回無
- 10. 實體框架4 - 映射存儲過程返回Guid
- 11. SQL存儲過程返回值到實體框架
- 12. 實體框架:如何運行存儲過程並返回值?
- 13. PLSQL存儲過程在實體沒有返回值框架
- 14. 實體框架 - 存儲過程返回值
- 15. 調用存儲過程,它不會返回使用實體框架
- 16. 實體框架3.5,將存儲過程結果映射到自定義實體
- 17. 實體框架的存儲過程映射結果不是唯一的實體
- 18. 使用實體框架讀取存儲過程的非鍵入結果
- 19. 如何使用實體框架訪問存儲過程的「結果」,「消息」和「返回值」4?
- 20. 實體框架MySQL的存儲過程
- 21. 存儲過程與實體框架
- 22. 實體框架4.0和存儲過程
- 23. SQL存儲過程實體框架VB.Net
- 24. 實體框架和MySql存儲過程
- 25. 實體框架核心,存儲過程
- 26. 實體框架多個存儲過程
- 27. 從實體框架的存儲過程
- 28. 存儲過程與ADO.NET實體框架
- 29. 存儲過程映射實體框架
- 30. 實體框架存儲過程和POCO