Entity Framework Core - Microsoft.Data.SqlClient.SqlException:列名称无效

问题描述 投票:0回答:2

我正在现有数据库上使用

Microsoft.EnityFrameworkCore.SqlServer
6.0.7 和数据库优先方法。我搭建了实体和上下文的脚手架,除了一个之外,大多数实体都是可查询的。

我收到以下错误:

Microsoft.Data.SqlClient.SqlException:列名“fldTimeOffRequestID”无效。
列名“fldCorpCode”无效。
列名“fldEmpID”无效。
列名“fldEmployeeComment”无效。
列名“fldEntryDate”无效。
列名“fldJobLoc”无效。
列名“fldManagerComment”无效。
列名“fldManagersLogonID”无效。
列名“fldMgrModifiedBy”无效。
列名“fldMgrModifiedDate”无效。
列名“fldPJobCode”无效。
列名“fldPeoplesoftID”无效。
列名“fldRequestDateEnd”无效。
列名“fldRequestDateStart”无效。
列名称“fldRestaurantNumber”无效。
列名“fldSAM”无效。
列名“fldSeriesID”无效。
列名“fldStatus”无效。
列名称“fldTempScheduleChange”无效。
列名“fldUserUpdateDate”无效。
列名“fldfName”无效。
列名“fldlName”无效。
列名“fldEntryDate”无效。

实体如下:

// tbl_TimeOffRequests        
public partial class TimeOffRequest
{
        public int TimeOffRequestID { get; set; } // fldTimeOffRequestID (Primary key)
        public string CorpCode { get; set; } // fldCorpCode (length: 10)
        public int RestaurantNumber { get; set; } // fldRestaurantNumber
        public int EmpID { get; set; } // fldEmpID
        public string SAM { get; set; } // fldSAM (length: 25)
        public System.DateTime RequestDateStart { get; set; } // fldRequestDateStart
        public System.DateTime RequestDateEnd { get; set; } // fldRequestDateEnd
        public byte Status { get; set; } // fldStatus
        public System.DateTime EntryDate { get; set; } // fldEntryDate
        public System.DateTime UserUpdateDate { get; set; } // fldUserUpdateDate
        public string ManagerComment { get; set; } // fldManagerComment (length: 255)
        public string EmployeeComment { get; set; } // fldEmployeeComment (length: 255)
        public string ManagersLogonID { get; set; } // fldManagersLogonID (length: 30)
        public System.DateTime? MgrModifiedDate { get; set; } // fldMgrModifiedDate
        public string MgrModifiedBy { get; set; } // fldMgrModifiedBy (length: 55)
        public string fName { get; set; } // fldfName (length: 30)
        public string lName { get; set; } // fldlName (length: 25)
        public string PJobCode { get; set; } // fldPJobCode (length: 4)
        public byte? JobLoc { get; set; } // fldJobLoc
        public int? PeoplesoftID { get; set; } // fldPeoplesoftID
        public System.Guid? SeriesID { get; set; } // fldSeriesID
        public bool TempScheduleChange { get; set; } = false; // fldTempScheduleChange
}

该实体的上下文条目是:

public partial class LmsContext : DbContext
{
        public LmsContext(DbContextOptions<LmsContext> options)
            : base(options)
        {
        }

        public virtual DbSet<TimeOffRequest> TimeOffRequests { get; set; } = null!;        

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {    
            modelBuilder.Entity<TimeOffRequest>(entity =>
            {
                entity.HasKey(e => e.TimeOffRequestID);

                entity.ToTable("tbl_TimeOffRequests");

                entity.HasIndex(e => e.RestaurantNumber, "DRI_IDX_TimeOffRequests_3")
                    .HasFillFactor(80);

                entity.HasIndex(e => new { e.RestaurantNumber, e.CorpCode, e.RequestDateStart, e.TimeOffRequestID, e.Status, e.PeoplesoftID }, "DRI_IDX_TimeOffRequests_Multi")
                    .HasFillFactor(80);

                entity.HasIndex(e => new { e.RestaurantNumber, e.RequestDateStart, e.RequestDateEnd, e.PeoplesoftID, e.TimeOffRequestID, e.Status }, "DRI_IDX_TimeOffRequests_Multi2");

                entity.HasIndex(e => e.PeoplesoftID, "IDX_DRI_tbl_TimeOffRequests_PeoplesoftID")
                    .HasFillFactor(80);

                entity.HasIndex(e => new { e.Status, e.RequestDateStart, e.JobLoc, e.RestaurantNumber }, "IX_tbl_TimeOffRequests_1")
                    .HasFillFactor(90);

                entity.HasIndex(e => new { e.RestaurantNumber, e.EmpID, e.Status }, "IX_tbl_TimeOffRequests_2")
                    .HasFillFactor(90);

                entity.HasIndex(e => new { e.RestaurantNumber, e.RequestDateStart, e.JobLoc }, "IX_tbl_TimeOffRequests_3")
                    .HasFillFactor(90);

                entity.HasIndex(e => new { e.CorpCode, e.RestaurantNumber, e.RequestDateStart }, "IX_tbl_TimeOffRequests_4")
                    .HasFillFactor(90);

                entity.HasIndex(e => new { e.Status, e.RequestDateStart, e.RestaurantNumber, e.JobLoc }, "IX_tbl_TimeOffRequests_5")
                    .HasFillFactor(90);

                entity.HasIndex(e => new { e.CorpCode, e.PJobCode }, "IX_tbl_TimeOffRequests_6")
                    .HasFillFactor(80);

                entity.Property(e => e.TimeOffRequestID).HasColumnName("fldTimeOffRequestID");

                entity.Property(e => e.CorpCode)
                    .HasMaxLength(10)
                    .IsUnicode(false)
                    .HasColumnName("fldCorpCode");

                entity.Property(e => e.EmpID).HasColumnName("fldEmpID");

                entity.Property(e => e.EmployeeComment)
                    .HasMaxLength(255)
                    .IsUnicode(false)
                    .HasColumnName("fldEmployeeComment");

                entity.Property(e => e.EntryDate)
                    .HasColumnType("smalldatetime")
                    .HasColumnName("fldEntryDate");

                entity.Property(e => e.JobLoc).HasColumnName("fldJobLoc");

                entity.Property(e => e.ManagerComment)
                    .HasMaxLength(255)
                    .IsUnicode(false)
                    .HasColumnName("fldManagerComment");

                entity.Property(e => e.ManagersLogonID)
                    .HasMaxLength(30)
                    .IsUnicode(false)
                    .HasColumnName("fldManagersLogonID");

                entity.Property(e => e.MgrModifiedBy)
                    .HasMaxLength(55)
                    .IsUnicode(false)
                    .HasColumnName("fldMgrModifiedBy");

                entity.Property(e => e.MgrModifiedDate)
                    .HasColumnType("smalldatetime")
                    .HasColumnName("fldMgrModifiedDate");

                entity.Property(e => e.PeoplesoftID).HasColumnName("fldPeoplesoftID");

                entity.Property(e => e.PJobCode)
                    .HasMaxLength(4)
                    .IsUnicode(false)
                    .HasColumnName("fldPJobCode");

                entity.Property(e => e.RequestDateEnd)
                    .HasColumnType("smalldatetime")
                    .HasColumnName("fldRequestDateEnd");

                entity.Property(e => e.RequestDateStart)
                    .HasColumnType("smalldatetime")
                    .HasColumnName("fldRequestDateStart");

                entity.Property(e => e.RestaurantNumber).HasColumnName("fldRestaurantNumber");

                entity.Property(e => e.SAM)
                    .HasMaxLength(25)
                    .IsUnicode(false)
                    .HasColumnName("fldSAM");

                entity.Property(e => e.SeriesID).HasColumnName("fldSeriesID");

                entity.Property(e => e.Status).HasColumnName("fldStatus");

                entity.Property(e => e.TempScheduleChange).HasColumnName("fldTempScheduleChange");

                entity.Property(e => e.UserUpdateDate)
                    .HasColumnType("smalldatetime")
                    .HasColumnName("fldUserUpdateDate");

                entity.Property(e => e.fName)
                    .HasMaxLength(30)
                    .IsUnicode(false)
                    .HasColumnName("fldfName");

                entity.Property(e => e.lName)
                    .HasMaxLength(25)
                    .IsUnicode(false)
                    .HasColumnName("fldlName");
            });
            
            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

所有列名称均与数据库中的名称相匹配。是否有什么东西搭错了脚手架?

编辑 这是表的 DDL

CREATE TABLE [dbo].[tbl_TimeOffRequests](
    [fldTimeOffRequestID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [fldCorpCode] [varchar](10) NOT NULL,
    [fldRestaurantNumber] [int] NOT NULL,
    [fldEmpID] [int] NOT NULL,
    [fldSAM] [varchar](25) NULL,
    [fldRequestDateStart] [smalldatetime] NOT NULL,
    [fldRequestDateEnd] [smalldatetime] NOT NULL,
    [fldStatus] [tinyint] NOT NULL,
    [fldEntryDate] [smalldatetime] NOT NULL,
    [fldUserUpdateDate] [smalldatetime] NOT NULL,
    [fldManagerComment] [varchar](255) NULL,
    [fldEmployeeComment] [varchar](255) NULL,
    [fldManagersLogonID] [varchar](30) NULL,
    [fldMgrModifiedDate] [smalldatetime] NULL,
    [fldMgrModifiedBy] [varchar](55) NULL,
    [fldfName] [varchar](30) NULL,
    [fldlName] [varchar](25) NULL,
    [fldPJobCode] [varchar](4) NULL,
    [fldJobLoc] [tinyint] NULL,
    [fldPeoplesoftID] [int] NULL,
    [fldSeriesID] [uniqueidentifier] NULL,
    [fldTempScheduleChange] [bit] NOT NULL,
 CONSTRAINT [PK_tbl_TimeOffRequests] PRIMARY KEY CLUSTERED 
(
    [fldTimeOffRequestID] ASC
)WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tbl_TimeOffRequests] ADD  CONSTRAINT [DF_tbl_TimeOffRequests_fldTempScheduleChange]  DEFAULT ((0)) FOR [fldTempScheduleChange]
GO

这是 EntityFrameworkCore 生成的 SQL:

SELECT TOP(1) [t].[fldTimeOffRequestID], [t].[fldCorpCode], [t].[fldEmpID], [t].[fldEmployeeComment], [t].[fldEntryDate], [t].[fldJobLoc], [t].[fldManagerComment], [t].[fldManagersLogonID], [t].[fldMgrModifiedBy], [t].[fldMgrModifiedDate], [t].[fldPJobCode], [t].[fldPeoplesoftID], [t].[fldRequestDateEnd], [t].[fldRequestDateStart], [t].[fldRestaurantNumber], [t].[fldSAM], [t].[fldSeriesID], [t].[fldStatus], [t].[fldTempScheduleChange], [t].[fldUserUpdateDate], [t].[fldfName], [t].[fldlName]
FROM [TimeOffRequest] AS [t]
ORDER BY [t].[fldEntryDate] DESC

看起来它从表名中删除了“tbl_”前缀。我该如何防止这种情况发生?

c# entity-framework-core
2个回答
0
投票

问题是数据库中有两个表名称相似……

  • tbl_TimeOffRequest
  • 休假请求

EF Core 将它们映射到同一个实体:TimeOffRequest。显然这是一个古怪的数据结构,因此 EF Core 团队可能没有考虑到这种情况。


0
投票

从 PackageManagerConsole 检查更新数据库,并查看表与其类实体是否匹配。

© www.soinside.com 2019 - 2024. All rights reserved.