LINQ生成不完整的查询

时间:2018-03-25 22:20:47

标签: c# .net visual-studio entity-framework linq

所以我有这个查询

var pac = from p in context.pacientebi where p.personalid == piradinomeri select p;

它会生成这个sql

SELECT
[Extent1].[id] AS [id],
[Extent1].[name] AS [name],
[Extent1].[surname] AS [surname],
[Extent1].[dateofbirth] AS [dateofbirth],
[Extent1].[personalid] AS [personalid],
[Extent1].[phonenumber] AS [phonenumber],
[Extent1].[sqesi] AS [sqesi],
[Extent1].[address] AS [address],
[Extent1].[shemosvlisdro] AS [shemosvlisdro],
[Extent1].[email] AS [email]
FROM [dbo].[pacientis] AS [Extent1]
WHERE ([Extent1].[personalid] = @p__linq__0) OR (([Extent1].[personalid] IS NULL) AND (@p__linq__0 IS NULL))
如果我更改表名以包含数据库名称,则

并且不返回任何值 像这样

FROM [dbo].[pacientis]

到这个

[CachedeskBase].[dbo].[pacientis]
一切都很好。 那么为什么linq to slq会产生不完整的查询呢?

2 个答案:

答案 0 :(得分:2)

我知道可能导致问题的原因;

您应检查当前的连接字符串是否包含默认目录参数,并可能确保已设置应用程序的数据库用户默认数据库。

在连接字符串中设置初始目录/数据库变量:
您可能错过了输入或忘记在连接字符串中包含default catalogue/database

在连接字符串中包含default catalogue会告诉数据库服务器您的请求使用哪个数据库。 (在这种情况下,您的LINQ /实体框架请求。)

以下是包含默认目录的连接字符串示例:

data source=[Your server's address];initial catalog=[Your database CachedeskBase in your case];persist security info=[set to false if you plan on using sql authentification, else true];user id=[Your default user];password=[your user's password];MultipleActiveResultSets=True;App=EntityFramework

附注:在生产环境甚至开发环境中,您不应包含普通数据库用户名和密码。如果您计划部署此应用程序,我建议您查看ISS App Pools。使用应用程序池时,不要为应用程序指定用户,因此也不要为其密码指定用户。用户ID和密码字段由integrated security标记

替换

设置应用程序的数据库用户默认数据库:
建议不要执行此操作,因为您的用户应始终拥有不包含任何潜在危险数据的默认目录/数据库。这主要是为了安全,因为您希望在潜在入侵者的路径中添加障碍。使您的应用程序的数据库成为您用户的默认数据库不应该是您想要发生的事情。

由于我正在运行SQL服务器实例,我将使用SQL Server作为我的示例。

SQL Server Management Studio中,转到security文件夹,然后转到数据库对象编辑器的logins文件夹中,然后双击您的用户。 (如果您使用的是IIS应用程序池,请查找IIS APPPOOL\[your app pool name])。

这应该打开登录属性窗口,允许您设置用户的默认数据库。 SSMS login property editor pointing out where to find the default database

答案 1 :(得分:0)

您可能需要按照要求here指定datacontext的连接字符串。

Dim connectionString = "Data Source=myserver;Initial Catalog=mydatabasename;Integrated Security=True"
Using ctx As New HRManagerDataContext(connectionString))
          Return (From us As User In ctx.Users
                 Where us.IsActive = True
                 Select us)
End Using