【问题标题】:How to fix SqlException: Invalid column name如何修复 SqlException:列名无效
【发布时间】: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; }

标签: c# entity-framework asp.net-mvc-5


【解决方案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; }
}

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多