相关疑难解决方法(0)

Entity Framework Code First是否支持存储过程?

我已经看了几次EF Code First的演示,还没有看到EFCF如何与存储过程一起工作.

如何声明一个将使用某些sp的方法?我是否可以将实体传递给调用sp的方法,而无需手动将实体属性映射到sp参数?

另外,如果我改变模型会发生什么?它会在从模型中重新创建表格时丢失我的sp吗?触发器呢?

如果不支持这些东西,是否有计划在将来支持它们?

c# stored-procedures entity-framework code-first

112
推荐指数
4
解决办法
9万
查看次数

必须使用dbcontext.Database.SqlQuery声明标量变量'@custid'?

我试图使用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)

如何管理?

c# sql asp.net entity-framework

15
推荐指数
1
解决办法
1万
查看次数

为什么Entity Framework在更改SqlParameter命令时会抛出异常?

我首先使用实体​​框架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 entity-framework

12
推荐指数
1
解决办法
2328
查看次数

使用SQL Server命名参数与ExecuteStoreQuery和ExecuteStoreCommand

我试图使用SQL Server命名参数ObjectContext.ExecuteStoreQueryObjectContext.ExecuteStoreCommand直接调用存储过程或函数.

SQL Server命名参数与实体框架命名参数不同 - 它们允许我执行与此类似的查询:

EXEC sp_GetData @firstParameter = 1, @thirdParameter = 2, @secondParameter = 1
Run Code Online (Sandbox Code Playgroud)

此查询中的参数顺序无关紧要,而与按顺序计算的实体框架命名参数相反.

我想在实体框架中使用SQL Server命名参数,以便在存储过程中更改参数的顺序时,调用它的实体框架代码不会受到影响.

sql-server entity-framework

11
推荐指数
2
解决办法
1万
查看次数

使用带参数的Database.ExecuteSqlCommand的正确语法是什么?

我使用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'附近的错误语法.

sql sql-server entity-framework

10
推荐指数
1
解决办法
2万
查看次数

从DbContext执行存储过程

我在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)

sql-server entity-framework-4.1

8
推荐指数
1
解决办法
2万
查看次数

在EF Code First和SQL 2005中导致"<存储过程名称>附近的语法不正确"的原因是什么?

我发现的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

8
推荐指数
1
解决办法
7492
查看次数

在单一模型中将Code First和Database First结合起来?

有没有办法在同一个上下文中结合代码优先和数据库优先?编辑EDMX文件时,我们遇到了大量的开发时性能问题(需要1.5分钟才能保存).我已经将我们的非插入/更新/删除UDF /存储过程移动到一些自动生成模型优先代码的自定义T4模板,但是OnModelCreating当涉及EDMX时我似乎无法调用.

我们考虑过的其他事情,但不会因某种原因而起作用:

  1. 我们不能(合理地)将我们的代码分离到多个上下文,因为我们的实体关系存在很多重叠.这似乎也是一个走过这条路线的人后悔.

  2. 我们尝试了两种不同的上下文,但实体和UDF之间存在相当多的连接.这可能是我们最后的希望,但我真的想避免它.

  3. 我们不能切换到Dapper,因为我们不幸地大量使用了IQueryable.

  4. 我们试图完全转向Code-First,但我们在EDMX中使用的功能不受支持(主要与插入/更新/删除存储过程映射有关).

entity-framework entity-framework-6

8
推荐指数
1
解决办法
3286
查看次数

如何从MVC调用需要日期时间的存储过程

我想用输入参数调用这个存储过程:

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)

所以这不会起作用,因为我基本上将我的日期时间转换为字符串.

我该怎么办呢?

c# stored-procedures entity-framework

4
推荐指数
1
解决办法
1867
查看次数

如何使用LINQ和EF6编写外部联接?

我有三个表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)

c# linq entity-framework

4
推荐指数
1
解决办法
2971
查看次数

实体框架SqlQuery使用重复参数执行查询

我在使用实体框架尝试使用重复参数执行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)

c# sql sql-server-2008 asp.net-mvc-4 entity-framework-5

3
推荐指数
1
解决办法
1万
查看次数