【问题标题】:Entity Framework 6.1 - Generated SQL has incorect column namesEntity Framework 6.1 - 生成的 SQL 有不正确的列名
【发布时间】: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


【解决方案1】:

问题是您的 User 类中没有外键属性,因此 EF 引入了一个。按照惯例,它使用 _ 作为外键列的名称。

我假设您的目标是现有数据库,否则 EF 会在数据库中为您生成此外键列。

您可以在类中引入外键属性(如果您希望将列称为属性名称以外的名称,请使用注释)。或者,您可以随时重命名引入的 FK,而不将其包含在您的模型中 - http://msdn.microsoft.com/en-us/data/jj591620#IndependentAssociation

【讨论】:

  • 嗨,Rowan,我已经尝试过您的建议,但似乎没有整理好。 modelBuilder.Entity(Of Employee)() _ .HasOptional(Function(e) e.User) _ .WithRequired(Function(e) e.Employee) _ .Map(Function(e) e.MapKey("EmployeeCode")) _ .WillCascadeOnDelete(False) 我希望这会产生正确的影响,但我收到以下错误。 EmployeeCode:名称:类型中的每个属性名称都必须是唯一的。已定义属性名称“EmployeeCode”。
【解决方案2】:
modelBuilder.Entity(Of Employee)() _
.Property(Function(e) e.EmployeeNo) _
.IsUnicode(False)

应该是

modelBuilder.Entity(Of Employee)() _
.Property(Function(e) e.EmployeeId) _
.IsUnicode(False)

【讨论】:

  • 但我将列名指定为 'EmployeeId' &lt;Key&gt; _ &lt;StringLength(10)&gt; _ &lt;Column("EmployeeId")&gt; Public Property EmployeeNo As String
  • 我这辈子都不知道如何在这个回复中使用格式化的代码 sn-p 哈哈
猜你喜欢
  • 2019-12-11
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多