我已经看了几次EF Code First的演示,还没有看到EFCF如何与存储过程一起工作.
如何声明一个将使用某些sp的方法?我是否可以将实体传递给调用sp的方法,而无需手动将实体属性映射到sp参数?
另外,如果我改变模型会发生什么?它会在从模型中重新创建表格时丢失我的sp吗?触发器呢?
如果不支持这些东西,是否有计划在将来支持它们?
我试图使用EF5从bcontext.Database.SqlQuery执行存储过程.
这是一个错误 must declare the scalar variable '@custid'
var results = _MiscContext.Database.SqlQuery<int>(
"exec sp_GetStaff @custid",
customerNumber).ToList<int>();
Run Code Online (Sandbox Code Playgroud)
1如果customerNumber是工作人员,则SP返回,否则返回empty行.
ALTER PROCEDURE [dbo].[sp_GetStaff]
@custid varchar(12)
AS
BEGIN
SET NOCOUNT ON;
SELECT
1 AS [C1]
FROM [dbo].[Staff] with (nolock)
WHERE [CUSTOMER_ID] = @custid
END
Run Code Online (Sandbox Code Playgroud)
如何管理?
我首先使用实体框架4.3代码调用存储过程我调用存储过程的方式是这样的:
var parameters = new[]
{
new SqlParameter("member", 1),
**new SqlParameter("Code","0165210662660001"),**
new SqlParameter("PageSize", 1),
new SqlParameter("PageNumber",1)
};
var result = context.Database.SqlQuery<resultClass>(
"mySpName @member, @Code, @PageSize,@PageNumber" parameters).ToList();
Run Code Online (Sandbox Code Playgroud)
它在SqlServer上执行,我得到了结果.
但是,如果我改变这样的参数的顺序:
var result = context.Database.SqlQuery<resultClass>("mySpName @Code, @member,@PageSize,@PageNumber" parameters).ToList();
var parameters = new[]
{
**new SqlParameter("Code","0165210662660001"),**
new SqlParameter("Member", 1),
new SqlParameter("PageSize", 1),
new SqlParameter("PageNumber",1)
};
Run Code Online (Sandbox Code Playgroud)
我收到这样的错误:
Error converting data type nvarchar to int
Run Code Online (Sandbox Code Playgroud)
存储过程如下:
ALTER PROCEDURE [c].[mySpName]
@Member INT ,
@Code VARCHAR (50) ,
@PageSize INT ,
@PageNumber INT
AS
Run Code Online (Sandbox Code Playgroud)
为什么我得到这个订单?保持参数顺序很重要吗?我能做什么才能调用存储过程而不关心参数顺序?
============我找到一个解决方法,它完美地工作============
public class …Run Code Online (Sandbox Code Playgroud) 我试图使用SQL Server命名参数ObjectContext.ExecuteStoreQuery和ObjectContext.ExecuteStoreCommand直接调用存储过程或函数.
SQL Server命名参数与实体框架命名参数不同 - 它们允许我执行与此类似的查询:
EXEC sp_GetData @firstParameter = 1, @thirdParameter = 2, @secondParameter = 1
Run Code Online (Sandbox Code Playgroud)
此查询中的参数顺序无关紧要,而与按顺序计算的实体框架命名参数相反.
我想在实体框架中使用SQL Server命名参数,以便在存储过程中更改参数的顺序时,调用它的实体框架代码不会受到影响.
我使用Entity Framework 4.2并希望调用具有输入参数的存储过程.我正在使用Database.ExecuteSqlCommand调用存储过程.
但是,为了正确映射参数,文档缺少正确的调用语法.我的google-foo让我失望,任何帮助都将受到赞赏.
即我有一个程序
procedure SetElementFrequency
@ElementTypeID integer,
@Frequency float
as ...
Run Code Online (Sandbox Code Playgroud)
我试过用它来试试
Database.ExecuteSqlCommand("exec SetElementFrequency @p0 @p1",
elementType, frequency);
Run Code Online (Sandbox Code Playgroud)
和
Database.ExecuteSqlCommand("exec SetElementFrequency {0} {1}",
elementType, frequency);
Run Code Online (Sandbox Code Playgroud)
但他们都失败了错误语法'@ p1'附近的错误语法.
我在SqlServer中有两个简单的存储过程:
SetData(@id int, @data varchar(10))GetData(@id int).GetData 当前返回单行单列结果集,但如果需要,我可以将其更改为适当的函数.
从DbContext实例执行这些操作的最佳方法是什么?
如果可能的话,我想避免必须进行自己的连接状态管理和/或暴露EF特定类型.我首先检索ObjectContext并查看Execute*函数,但文档非常糟糕,缺少涉及存储过程的示例.
理想情况下,我希望能够做到这一点:
myContext.ExecuteNonQuery("SetData", id, data);
var data = myContext.ExecuteScalar<string>("GetData", id);
Run Code Online (Sandbox Code Playgroud) 我发现的System.Data.Entity.Database.SqlQuery方法的示例似乎与SQL 2008 R2兼容,但似乎不适用于SQL 2005.
此调用适用于SQL 2008 R2:
var myEntities = dbContext.Database.SqlQuery<MyEntity>("GetDataFromMySp @EntityId = {0}", entityId);
Run Code Online (Sandbox Code Playgroud)
但是,在SQL 2005中,此语句将抛出一个SqlException,并显示错误消息"GetDataFromMySp'附近的语法不正确".
stored-procedures entity-framework sql-server-2005 code-first ef-code-first
有没有办法在同一个上下文中结合代码优先和数据库优先?编辑EDMX文件时,我们遇到了大量的开发时性能问题(需要1.5分钟才能保存).我已经将我们的非插入/更新/删除UDF /存储过程移动到一些自动生成模型优先代码的自定义T4模板,但是OnModelCreating当涉及EDMX时我似乎无法调用.
我们考虑过的其他事情,但不会因某种原因而起作用:
我们不能(合理地)将我们的代码分离到多个上下文,因为我们的实体关系存在很多重叠.这似乎也是一个走过这条路线的人后悔.
我们尝试了两种不同的上下文,但实体和UDF之间存在相当多的连接.这可能是我们最后的希望,但我真的想避免它.
我们不能切换到Dapper,因为我们不幸地大量使用了IQueryable.
我们试图完全转向Code-First,但我们在EDMX中使用的功能不受支持(主要与插入/更新/删除存储过程映射有关).
我想用输入参数调用这个存储过程:
proc [dbo].[Invoice_GetHomePageInvoices] (
@FinancialYearStartDate datetime = null
, @FinancialYearEndDate datetime = null
Run Code Online (Sandbox Code Playgroud)
麻烦的是我通常从我的代码调用存储过程的方式是:
return _db.Database.SqlQuery<HomePageInvoice>(string.Format("EXEC Invoice_GetHomePageInvoices @FinancialYearStartDate = '{0}', @FinancialYearEndDate = '{1}'", financialYear.StartDate.ToString(), financialYear.EndDate.ToString()));
Run Code Online (Sandbox Code Playgroud)
所以这不会起作用,因为我基本上将我的日期时间转换为字符串.
我该怎么办呢?
我有三个表Exam,Test和UserTest。
CREATE TABLE [dbo].[Exam] (
[ExamId] INT IDENTITY (1, 1) NOT NULL,
[SubjectId] INT NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
[Description] NVARCHAR (MAX) NOT NULL,
CONSTRAINT [PK_Exam] PRIMARY KEY CLUSTERED ([ExamId] ASC),
CONSTRAINT [FK_ExamSubject] FOREIGN KEY ([SubjectId]) REFERENCES [dbo].[Subject] ([SubjectId]),
CONSTRAINT [FK_Exam_ExamType] FOREIGN KEY ([ExamTypeId]) REFERENCES [dbo].[ExamType] ([ExamTypeId])
);
CREATE TABLE [dbo].[Test] (
[TestId] INT IDENTITY (1, 1) NOT NULL,
[ExamId] INT NOT NULL,
[Title] NVARCHAR (100) NULL,
[Status] INT NOT NULL,
[CreatedDate] DATETIME NOT NULL,
CONSTRAINT [PK_Test] PRIMARY …Run Code Online (Sandbox Code Playgroud) 我在使用实体框架尝试使用重复参数执行SQL查询时遇到了麻烦.
查询是关键字搜索,它在不同的表中查找,因此多次使用相同的参数.我正在使用LIKE语句(是的,我知道我应该使用FULLTEXTSEARCH,但我现在没有时间).
我已经尝试了这里解释的所有语法:如何在存储过程中使用DbContext.Database.SqlQuery <TElement>(sql,params)?EF Code First CTP5 并且它们都不会使查询工作(我得到零返回行).
我甚至尝试在运行时构建一个字符串数组,其长度等于参数在查询中重复的次数,然后使用关键字搜索项填充数组的所有元素.然后我将其作为对象[]参数传递给我.也没用.
唯一有效的方法是进行搜索和替换,这显然是一个坏主意,因为参数来自文本输入,我将容易受到SQL注入攻击.
工作代码(易受SQL注入攻击,但查询返回行):
//not the real query, but just for you to have an idea
string query =
"SELECT Field1, " +
" Field2 " +
"FROM Table1 " +
"WHERE UPPER(Field1) LIKE '%{0}%' " +
"OR UPPER(Field2) LIKE '%{0}%'";
//keywordSearchTerms is NOT sanitized
query = query.Replace("{0}", keywordSearchTerms.ToUpper());
List<ProjectViewModel> list = null;
using (var context = new MyContext())
{
list = context.Database.SqlQuery<ProjectViewModel>(query, new object[] { }).ToList();
}
return …Run Code Online (Sandbox Code Playgroud)