【发布时间】:2015-02-08 13:05:05
【问题描述】:
EF 6.1 生成错误的查询 sql 并因此不返回我的数据。
所以 EF 正在生成以下 SQL,其中 BOLD 显示 Employee_EmployeeNo 的列名不正确,实际上应该是 EmployeeId
exec sp_executesql N'SELECT
[Limit1].[C1] AS [C1],
[Limit1].[Username] AS [Username],
[Limit1].[EmployeeCode] AS [EmployeeCode],
[Limit1].[IsActive] AS [IsActive],
[Limit1].[CreatedDate] AS [CreatedDate],
[Limit1].[ModifiedDate] AS [ModifiedDate],
[Limit1].[LastMachineUsed] AS [LastMachineUsed],
[Limit1].[LastLogonDate] AS [LastLogonDate],
[Limit1].[Employee_EmployeeNo] AS [Employee_EmployeeNo],
[Limit1].[Username1] AS [Username1],
[Limit1].[ObjectName] AS [ObjectName]
FROM ( SELECT TOP (2)
[Extent1].[Username] AS [Username],
[Extent1].[EmployeeCode] AS [EmployeeCode],
[Extent1].[IsActive] AS [IsActive],
[Extent1].[CreatedDate] AS [CreatedDate],
[Extent1].[ModifiedDate] AS [ModifiedDate],
[Extent1].[LastMachineUsed] AS [LastMachineUsed],
[Extent1].[LastLogonDate] AS [LastLogonDate],
[Extent1].[**Employee_EmployeeNo**] AS [Employee_EmployeeNo],
[Extent2].[Username] AS [Username1],
[Extent2].[ObjectName] AS [ObjectName],
1 AS [C1]
FROM [dbo].[tblUser] AS [Extent1]
LEFT OUTER JOIN [dbo].[tblUserSecurity] AS [Extent2] ON ([Extent2].[User_Username] IS NOT NULL) AND ([Extent1].[Username] = [Extent2].[User_Username])
WHERE [Extent1].[Username] = @p0
) AS [Limit1]',N'@p0 varchar(8000)',@p0='USERNAME'
上下文
modelBuilder.Entity(Of Employee)() _
.Property(Function(e) e.EmployeeNo) _
.IsUnicode(False)
modelBuilder.Entity(Of Employee)() _
.Property(Function(e) e.Forename) _
.IsUnicode(False)
modelBuilder.Entity(Of Employee)() _
.Property(Function(e) e.Surname) _
.IsUnicode(False)
modelBuilder.Entity(Of Employee)() _
.HasOptional(Function(e) e.User)
modelBuilder.Entity(Of User)() _
.HasKey(Function(e) e.Username)
modelBuilder.Entity(Of User)() _
.Property(Function(e) e.Username) _
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None) _
.IsUnicode(False)
modelBuilder.Entity(Of User)() _
.Property(Function(e) e.EmployeeNo) _
.IsUnicode(False)
modelBuilder.Entity(Of User)() _
.Property(Function(e) e.LastMachineUsed) _
.IsUnicode(False)
modelBuilder.Entity(Of User)() _
.Property(Function(e) e.LastMachineUsed) _
.IsUnicode(False)
modelBuilder.Entity(Of User)() _
.HasOptional(Function(e) e.Employee) _
.WithOptionalDependent(Function(s) s.User)
modelBuilder.Entity(Of UserSecurity)() _
.Property(Function(e) e.Username) _
.IsUnicode(False)
modelBuilder.Entity(Of UserSecurity)() _
.Property(Function(e) e.ObjectName) _
.IsUnicode(False)
modelBuilder.Entity(Of UserSecurity)() _
.Property(Function(e) e.AccessLevel) _
.IsFixedLength() _
.IsUnicode(False)
modelBuilder.Entity(Of UserSecurity)() _
.HasOptional(Function(e) e.User) _
.WithOptionalDependent(Function(e) e.UserSecurity)
员工
Partial Public Class Employee
<Key> _
<StringLength(10)> _
<Column("EmployeeId")>
Public Property EmployeeNo As String
<Required> _
<StringLength(50)> _
<Column("Forename")>
Public Property Forename As String
<Required> _
<StringLength(50)> _
<Column("Surname")>
Public Property Surname As String
<Required> _
<Column("StartDate", TypeName:="date")>
Public Property StartDate As DateTime
<Column("EndDate", TypeName:="date")>
Public Property EndDate As DateTime?
<Required> _
<Column("SiteCode")>
Public Property SiteId As Integer
Public Overridable Property Site As Site
Public Overridable Property User As User
End Class
用户
Partial Public Class User
<Key> _
<StringLength(50)> _
<Column("Username")>
Public Property Username As String
<Required> _
<StringLength(10)> _
<Column("EmployeeCode")>
Public Property EmployeeNo As String
<Column("IsActive")>
Public Property IsActive As Boolean
<Required> _
<Column("CreatedDate", TypeName:="date")>
Public Property CreatedDate As DateTime
<Column("ModifiedDate", TypeName:="date")>
Public Property ModifiedDate As DateTime?
<StringLength(50)> _
<Column("LastMachineUsed")>
Public Property LastMachineUsed As String
<Column("LastLogonDate", TypeName:="date")>
Public Property LastLogonDate As DateTime?
Public Overridable Property Employee As Employee
Public Overridable Property UserSecurity As UserSecurity
End Class
用户安全
Partial Public Class UserSecurity
<Key> _
<Column("Username", Order:=0)> _
<StringLength(50)>
Public Property Username As String
<Key> _
<Column("ObjectName", Order:=1)> _
<StringLength(50)>
Public Property ObjectName As String
<Column("IsSecurityGroup")>
Public Property IsSecurityGroup As Boolean
<Required> _
<StringLength(1)> _
<Column("AccessLevel")>
Public Property AccessLevel As String
<DatabaseGenerated(DatabaseGeneratedOption.None)> _
<Column("CheckOrder")>
Public Property CheckOrder As Integer
<Column("CreatedDate", TypeName:="date")>
Public Property CreatedDate As DateTime
Public Overridable Property User As User
End Class
我哪里错了? 为什么 EF 忽略 Column 属性? 为什么在 SQL 中使用 ClassName_KeyName 而不是 Column Attribute 中的 Field Name?
干杯
【问题讨论】:
-
我发现不是:
Return context.Users.Find(Username)我可以使用:Return context.Users.SqlQuery("SELECT u.Username, u.EmployeeCode, u.IsActive, u.CreatedDate, u.ModifiedDate, u.LastMachineUsed, u.LastLogonDate, u.EmployeeCode, us.ObjectName FROM tblUser AS u LEFT OUTER JOIN tblUserSecurity AS us ON u.Username = us.Username WHERE (u.Username = @Username)", New SqlParameter("@Username", Username)).SingleOrDefault但这肯定会破坏使用像 EF 这样的 ORM 的目标??
标签: sql asp.net vb.net entity-framework webforms