不存在的列

时间:2015-07-02 17:21:47

标签: c# asp.net entity-framework visual-studio linq-to-sql

我正在实习期间接受培训,以了解asp.net和MVC。我们目前面临的问题是我和我的老板似乎都无法解决。 我有一个预先构建的两个表的数据库,Camper和Guardian。 Camper有一个映射到Guardian ID的外键(guardID)。

在我的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'的外键。 但是当我运行我的程序并添加一个露营者时,它在db.saveChanges()上失败了。错误显示“无效的列名称'Guardian_ID'。”

这个问题与我的相似: entity framework 4.1 invalid column name

除非我按照其中提供的解决方案之一(按照惯例将我的guardID更改为Guardian_ID),否则仍会抛出错误,但这次正在寻找'Guardian_ID1'。

我们还注意到,如果密钥的DB中的列名称不是“ID”,那么我们会收到一条错误,指出没有分配密钥,即使在.dbml中清楚显示键已指定。根据我的经验,Linq不能很好地处理任何不符合预期的列名。

1 个答案:

答案 0 :(得分:0)

所以我最近遇到了同样的问题,这似乎是因为我们的迁移与我们的模型不同步造成的。问题出在我身上的是通过FK引用子进程的父DataModel。我必须做的是

删除对" Child"的引用来自"父母"模型。然后添加了一个反映该更改的新迁移。

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

当您编写SQL脚本时,仅复制所有内容    INSERT条款。 (这是进入迁移的原因    _MigrationHistory表

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

然后,为了更好的衡量,我又跑了Update-Database。然后跑了我的    申请再次,它运作良好。

所以简而言之,导致这个问题的原因是我们已经删除了从Child到Parent的引用,但没有反过来。对于LINQ来说,它似乎认为这种关系仍然存在,因此它成为查询的一部分。