C#; EF 数据库优先模式

Posted

技术标签:

【中文标题】C#; EF 数据库优先模式【英文标题】:C#; EF database first mode 【发布时间】:2021-03-22 07:48:37 【问题描述】:

我在 EF 中使用了数据库优先模式。我需要您的帮助,因为我在尝试运行此代码时遇到了问题:

private void btnSearch_Click(object sender, EventArgs e)

    string SNumber = txtSearchByNum.Text;
   
    var qSearchByTypeText = database.tblNote.SqlQuery("select * From tblNote Where fNumber=@t0", SNumber).ToList();

我收到此错误:

System.Data.Entity.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常

附加信息:必须声明标量变量“@t0”。

这可能是由于 ٍEntity Framework 版本的原因吗?

【问题讨论】:

您使用的是哪个版本的实体框架? 为什么要使用 sql 字符串来完成 Entity Framework 能够做的事情? var qSearchByTypeText = database.tblNote.Where(note => note.fNumber == SNumber).ToList(); 实体框架6.0.0 这不是 EF 的问题。您必须在命令中声明标量变量"@t0". 最简单的答案是不要...正如 Andrew 指出的那样,您完全忽略了使用 ORM 的意义。 EF 和 Linq 将为您解决所有这些问题。鉴于您的示例,绝对没有理由编写 SQL。 【参考方案1】:

你需要传递如下参数:

var qSearchByTypeText = database.tblNote.SqlQuery("select * From tblNote Where fNumber=@t0", new SqlParameter("@t0", SNumber)).ToList();

【讨论】:

我应该使用什么“使用”? 使用 Microsoft.Data.SqlClient; 错误:附加信息:不存在从对象类型 soft.SqlParameter 到已知托管提供程序本机类型的映射。 entityframeworktutorial.net/EntityFramework4.3/…【参考方案2】:

如果您要求使用 EF6.0“使用”语句来包含创建并返回行列表的 EF/ORM 查询,我会这样做:

var qSearchByTypeText = new List<Note>();  //where "Note" is a data structure that looks like a row of columns in "tblNote".

using (var myDbEntity = new [your 'Database First' Entity name]())

   //then your query
   qSearchByTypeText = (from n in myDBEntity.tblNotes where n.fNumber == SNumber select n).ToList();


【讨论】:

以上是关于C#; EF 数据库优先模式的主要内容,如果未能解决你的问题,请参考以下文章

EF的三种模式

EF Core-1

EF 4.1 代码优先:多对多

EF 6.1 标量值函数数据库优先

ASP MVC 数据库优先 - 刷新 EF 实体框架时丢失所有验证

C# EF6 代码优先实体状态