如何修复 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”