不存在列的Linq错误
本文关键字:错误 Linq 不存在 | 更新日期: 2023-09-27 18:00:48
我正在实习中接受培训,以了解asp.net和MVC。我们目前面临着一个我和老板似乎都无法解决的问题。我有一个预先构建的数据库,里面有两张表,Camper和Guardian。Camper有一个外键(guardID(,可以映射到Guardian的ID。
在我的VS项目中,我有两个模型,GuardianEntity和CamperEntity。我还使用LINQ to SQL创建了数据库模型(dbGuardian和dbCamper(。我的控制器将实体模型转换为数据库模型,反之亦然。
以下是LINQ生成的外键分配:
[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Guardian_Camper", Storage="_Guardian", ThisKey="guardID", OtherKey="ID", IsForeignKey=true)]
public Guardian Guardian
{
get
{
return this._Guardian.Entity;
}
set
{
Guardian previousValue = this._Guardian.Entity;
if (((previousValue != value)
|| (this._Guardian.HasLoadedOrAssignedValue == false)))
{
this.SendPropertyChanging();
if ((previousValue != null))
{
this._Guardian.Entity = null;
previousValue.Campers.Remove(this);
}
this._Guardian.Entity = value;
if ((value != null))
{
value.Campers.Add(this);
this._guardID = value.ID;
}
else
{
this._guardID = default(int);
}
this.SendPropertyChanged("Guardian");
}
}
}
因此,它似乎将"guardID"识别为映射到"ID"的外键。但是当我运行我的程序并添加一个camber时,它在db.saveChanges((上失败了。错误显示"无效的列名'Guardian_ID'。">
这个问题和我的类似:实体框架4.1无效列名
除了当我遵循那里提供的一个解决方案(根据惯例将我的guardID更改为Guardian_ID(时,错误仍然存在,但这次是在寻找"Guardian_ID1"。
我们还注意到,如果DB中键的列名不是"ID",我们会得到一个错误,表明没有分配键,尽管.dbml中明确指定了键。根据我的经验,Linq不会很好地处理任何不符合它预期的列名。
所以我最近遇到了同样的问题,这似乎是由于我们的迁移与模型不同步造成的。对我来说,问题是一个通过FK引用孩子的父DataModel
从"父级"模型中删除对"子级"的引用。然后添加了一个反映这一变化的新迁移。
然后在Visual Studio 的包管理器控制台中运行Update-Database -Script
编写SQL脚本后,只复制INSERT子句。(这就是迁移到_迁移历史表(
复制后,将其粘贴到SSMS中的新查询中。正在执行该查询只会将条目添加到历史记录和如果您愿意的话,迁移将是"同步的"。
然后,我再次运行了Update-Database
。然后运行我的再次应用,效果良好。
因此,简而言之,最终导致这个问题的原因是,我们删除了从"孩子"到"父母"的引用,但没有反过来。对LINQ来说,它似乎认为这种关系仍然存在,因此将其作为查询的一部分。