System.ComponentModel.DataAnnotations 2023

System.ComponentModel.DataAnnotations 2023

提问人:GCDevOps 提问时间:10/21/2023 最后编辑:GCDevOps 更新时间:10/21/2023 访问量:56

问:

有什么变化?我已经在生产环境中开发和部署了这个 C# Razor 应用程序(SQL 后端)3 年了。最近,我在 SQL 中添加了 3 个新表,而不是使用包管理器控制台添加迁移,我只是手动编辑了现有的 DBContext 类以添加三个新的 DbSet...

  public virtual DbSet<PaymentPlan> oDbSetPmtPlan { get; set; }  

在我的 Models 目录中添加了三个新类,并编辑了需要从新表中获取数据的现有 Razor 页面。我的本地数据库是生产的副本。每次运行我的项目时,当我尝试打开引用其中一个新表的页面时,我总是收到一个无效的对象错误。

public IList<Models.PaymentPlan> OPmtPlansList { get; set; }
.
.
.
public async Task<IActionResult> OnGetAsync(string id)
{
.
.
OPmtPlansList = await _dbWriterContext.oDbSetPmtPlan.Where(m => m.ToBalance <= TotalBalanceDue).ToListAsync();

在 PaymentPlan 类 [Table(“{SQL Server 中的表名称”)] 中添加此标记后,我终于让它工作了。

namespace Customer_BlahBlah.Models
{
    [Table("PaymentPlan")]
    public partial class PaymentPlan
    {
        [Key]
        public Guid PlanId { get; set; }

我不明白。我的其他现有类从未有过这个标记并继续工作,即 CRUD。我在 SSMS 中设计新表的方式没有什么不同。我比较了一切。调试遍历了所有内容,但没有任何意义。

这些是我目前在项目中使用的版本......

Id                                                   Versions    ProjectName    
--                                                   --------    -----------    
Microsoft.Extensions.Configuration.UserSecrets       {6.0.1}     Customer Blah
IBM.Data.DB2.Core                                    {3.1.0.600} Customer Blah
Microsoft.VisualStudio.Web.CodeGeneration.Design     {5.0.2}     Customer Blah
MailKit                                              {3.3.0}     Customer Blah
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation    {6.0.8}     Customer Blah
Microsoft.EntityFrameworkCore                        {6.0.8}     Customer Blah
Microsoft.EntityFrameworkCore.SqlServer              {6.0.8}     Customer Blah
System.Linq.Dynamic.Core                             {1.2.19}    Customer Blah
Microsoft.CodeAnalysis.CSharp.Workspaces             {4.2.0}     Customer Blah
EntityFramework.IBM.DB2                              {6.4.1}     Customer Blah
Microsoft.AspNetCore.Identity.EntityFrameworkCore    {6.0.8}     Customer Blah
Net.IBM.Data.Db2                                     {6.0.0.200} Customer Blah
EntityFramework                                      {6.4.4}     Customer Blah
Microsoft.EntityFrameworkCore.Relational             {6.0.8}     Customer Blah
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore {6.0.8}     Customer Blah
Microsoft.AspNetCore.Identity.UI                     {6.0.8}     Customer Blah
MimeKit                                              {3.4.0}     Customer Blah
Microsoft.EntityFrameworkCore.Tools                  {6.0.8}     Customer Blah
IBM.EntityFrameworkCore                              {6.0.0.200} Customer Blah

16 有待更新,但是,我正在推迟更新,直到我更好地了解这个奇怪问题的当前情况。

编辑以添加脚本以创建上述表。

CREATE TABLE [dbo].[PaymentPlan](
    [PlanId] [int] IDENTITY(1,1) NOT NULL,
    [FromBalance] [numeric](6, 2) NOT NULL,
    [ToBalance] [numeric](6, 2) NOT NULL,
    [MaxMonthsLimit] [int] NOT NULL,
 CONSTRAINT [PK_PaymentPlan] PRIMARY KEY CLUSTERED 
(
    [PlanId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'The Plan Unique Identifier' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'PaymentPlan', @level2type=N'COLUMN',@level2name=N'PlanId'
GO
c# sql-服务器 实体框架核心 剃须刀页面 数据注释

评论

0赞 Xedni 10/21/2023
你能展示表格创建脚本吗(假设它不是巨大的或专有的)?我想至少看到语句,也许它们是关键字段和约束create table
0赞 GCDevOps 10/21/2023
@Xedni我会编辑我的帖子并把它放在那里。
0赞 AlwaysLearning 10/21/2023
它看起来和现在的定义是兼容的吗?[PlanId] [int] IDENTITY(1,1) NOT NULL[Key] public Guid PlanId { get; set; }
0赞 GCDevOps 10/21/2023
@AlwaysLearning 同一项目中早期的现有类是使用 EF Core Power Tools 生成的,对于 SQL Server 标识,它始终将其映射到类模块中的公共 Guid。

答:

3赞 Mike Brind 10/21/2023 #1

根据您发布的代码,您的名称 : 与 SQL Server 表 : 的 名称 不匹配。EF Core 将查找以该属性命名的表(而不是其泛型类型),除非使用 DataAnnotations 或 Fluent API 配置其他表名(就像你最终所做的那样)。DbSetoDbSetPmtPlanPaymentPlanDbSet

这一直是 EF Core 的工作惯例。一切都没有改变。

https://learn.microsoft.com/en-us/ef/core/modeling/entity-types?tabs=data-annotations#table-name

评论

0赞 GCDevOps 10/22/2023
你是对的。我将 oDbSetPmtPlan 重命名为与 SQL SErver 中的表相同的名称,从类模块中删除了 Table 属性并重新运行了我的项目,它按预期工作。