不存在列的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不会很好地处理任何不符合它预期的列名。

不存在列的Linq错误

所以我最近遇到了同样的问题,这似乎是由于我们的迁移与模型不同步造成的。对我来说,问题是一个通过FK引用孩子的父DataModel

从"父级"模型中删除对"子级"的引用。然后添加了一个反映这一变化的新迁移。

然后在Visual Studio 的包管理器控制台中运行Update-Database -Script

编写SQL脚本后,只复制INSERT子句。(这就是迁移到_迁移历史表(

复制后,将其粘贴到SSMS中的新查询中。正在执行该查询只会将条目添加到历史记录和如果您愿意的话,迁移将是"同步的"。

然后,我再次运行了Update-Database。然后运行我的再次应用,效果良好。

因此,简而言之,最终导致这个问题的原因是,我们删除了从"孩子"到"父母"的引用,但没有反过来。对LINQ来说,它似乎认为这种关系仍然存在,因此将其作为查询的一部分。