我正在实习期间接受培训,以了解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不能很好地处理任何不符合预期的列名。
答案 0 :(得分:0)
所以我最近遇到了同样的问题,这似乎是因为我们的迁移与我们的模型不同步造成的。问题出在我身上的是通过FK引用子进程的父DataModel。我必须做的是
删除对" Child"的引用来自"父母"模型。然后添加了一个反映该更改的新迁移。
然后在Visual Studio的程序包管理器控制台中运行Update-Database -Script
当您编写SQL脚本时,仅复制所有内容 INSERT条款。 (这是进入迁移的原因 _MigrationHistory表)
复制完之后,将其粘贴到SSMS中的新查询中。执行 查询只会将条目添加到历史记录和您的 如果愿意的话,迁移将会同步进行。
然后,为了更好的衡量,我又跑了Update-Database
。然后跑了我的
申请再次,它运作良好。
所以简而言之,导致这个问题的原因是我们已经删除了从Child到Parent的引用,但没有反过来。对于LINQ来说,它似乎认为这种关系仍然存在,因此它成为查询的一部分。