如何修复 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:列名无效的主要内容,如果未能解决你的问题,请参考以下文章