我正在现有数据库上使用
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_”前缀。我该如何防止这种情况发生?
问题是数据库中有两个表名称相似……
EF Core 将它们映射到同一个实体:TimeOffRequest。显然这是一个古怪的数据结构,因此 EF Core 团队可能没有考虑到这种情况。
从 PackageManagerConsole 检查更新数据库,并查看表与其类实体是否匹配。