如何修复 SqlException:列名无效

Posted

技术标签:

【中文标题】如何修复 SqlException:列名无效【英文标题】:How to fix SqlException: Invalid column name 【发布时间】:2020-02-23 09:11:31 【问题描述】:

我在带有 SQL Server 的 MVC5 中使用 EF 代码优先迁移。 我创建了一个 post 方法,我正在从客户端发布 DTO 数据,我相信这一切都很好,但是当我尝试将数据保存到数据库时,我在外键属性上得到了这个无效的列名异常。

这是我第一次真正解决这个错误。我检查了其他问题,大多数答案都与 [ForeignKey] 数据注释有关,但我认为我以正确的方式实现了它

这是模型

public class ServiceProvider
    
        public Guid Id  get; set; 
        public string Name  get; set; 
        public string PhoneNumber  get; set; 
        public double YearsOfExperiance  get; set; 
        public double AverageRank  get; set; 
        public string Nationality  get; set; 
        public ICollection<JobImage> JobImages  get; set; 
        public ICollection<Review> Reviews  get; set; 
        public ICollection<Rank> Ranks  get; set; 
        public bool Active  get; set; 

        [ForeignKey("Category")]
        public int CategoryId  get; set; 
        public Category Category  get; set; 

        public bool Approved  get; set; 

这是控制器的 ActionResult 方法

[HttpPost]
        public ActionResult AddServiceProvider(ServiceProviderDTO serviceProvider)
        
            bool isInDb = _context.ServiceProviders.Any(s => s.Name == serviceProvider.Name) ? true : false;
            //var serviceProviderInDb = _context.ServiceProviders.Where(s => s.Name == serviceProvider.Name).FirstOrDefault();

            var newServiceProvider = new ServiceProvider();

            if (isInDb == false)
            
                newServiceProvider = new ServiceProvider
                
                    Id = Guid.NewGuid(),
                    Name = serviceProvider.Name,
                    PhoneNumber = serviceProvider.PhoneNumber,
                    YearsOfExperiance = serviceProvider.YearsOfExperiance,
                    Nationality = serviceProvider.Nationality,
                    CategoryId = serviceProvider.CategoryId,
                    Active = true,
                    Approved = serviceProvider.Approved == null ? false : serviceProvider.Approved.Value
                ;

                _context.ServiceProviders.Add(newServiceProvider);
                _context.SaveChanges();
            

            return RedirectToAction("Index", "Home");
        

错误发生在_context.SaveChanges(); 它指出CategoryId 是无效的列名

这不是我第一次使用代码优先迁移,而且我之前从未遇到过这个错误,所以我真的不知道为什么会发生这种情况!

【问题讨论】:

那么......Category 表的模型是什么? PK只是Id还是事实上CategoryId 您最近是否更改了列名? @BrendanGreen 只是 ID 您能否转到 Management Studio 并让它为Category 表和ServiceProvider 表生成/提取CREATE TABLE 脚本(并包括在问题中)。 您是否尝试将Category 标记为virtual(例如public virtual Category Category get; set; 【参考方案1】:

我会有这样的模型。

ForeignKey 属性属于Category 属性

public class ServiceProvider
    
        public Guid Id  get; set; 
        public string Name  get; set; 
        public string PhoneNumber  get; set; 
        public double YearsOfExperiance  get; set; 
        public double AverageRank  get; set; 
        public string Nationality  get; set; 
        public ICollection<JobImage> JobImages  get; set; 
        public ICollection<Review> Reviews  get; set; 
        public ICollection<Rank> Ranks  get; set; 
        public bool Active  get; set;     
        public int CategoryId  get; set; 

        [ForeignKey("CategoryId")]
        public Category Category  get; set; 

        public bool Approved  get; set; 

【讨论】:

您可能还有其他问题...您是否可以选择从干净的数据库开始并重新运行迁移? 'didn't work 帮助不大 - 请描述异常等 好吧,当我在一个新的数据库上运行更新数据库时,问题就开始了。我在本地 Visual Studio db 上运行 db,然后我在 sql server one 上运行所有迁移【参考方案2】:

你需要删除这个属性public int CategoryId get; set;

你的属性 public Category Category get; set; 是 ForeignKey 并添加 DataAnnotations [ForeignKey("CategoryId")]

应该是这样的

public class ServiceProvider

    public Guid Id  get; set; 
    public string Name  get; set; 
    public string PhoneNumber  get; set; 
    public double YearsOfExperiance  get; set; 
    public double AverageRank  get; set; 
    public string Nationality  get; set; 
    public ICollection<JobImage> JobImages  get; set; 
    public ICollection<Review> Reviews  get; set; 
    public ICollection<Rank> Ranks  get; set; 
    public bool Active  get; set; 

    [ForeignKey("Category")]
    public int CategoryId  get; set; 
    public Category Category  get; set; 

    public bool Approved  get; set; 

【讨论】:

以上是关于如何修复 SqlException:列名无效的主要内容,如果未能解决你的问题,请参考以下文章

我有这个错误:java.sql.SQLException:Java 应用程序中的列名无效

(复制) System.Data.SqlClient.SqlException: '无效的列名'

在列表框上使用数据源时修改数据库后 System.Data.SqlClient.SqlException(无效的列名'...')

System.Data.Entity.Core.EntityCommandExecutionException 和内部异常 SqlException:无效的列名“xxxx”

com.ibm.db2.jcc.b.SqlException:无效参数:未知列名 COL1

Java 中获得Access 数据库中的表名和表中的列名 及每个列的数据类型