修复Code First / EF6中的模型/列映射

时间:2015-05-29 15:14:52

标签: entity-framework

首先,我用脚射击自己。我正在构建一个测试应用程序(这是与工作相关的,而不是学校顺便说一句。)我有一个具有外键属性的模型

Home_TeamId

映射到名为

的列 我的数据库中

Home_TeamId。一切都很开心,直到我重构所有内容以使用ID代替Id。我没有注意到Migration添加了一个名为Home_TeamID1的列,并将数据存储在那里而不是Home_TeamId(我想要的地方。)

所以我想做的是:

  1. 删除列Home_TeamID1(没问题,我可以这样做。)

  2. 将Home_TeamId重命名为Home_TeamID。 (没问题,我可以这样做。)

  3. 告诉EF将数据写入原始列。

  4. 我已经阅读了如何在DbContext中使用数据库映射,但这不是我正在尝试做的事情(也就是说,这是一次性的事情,而不是我每次应用时都需要做的事情运行。)(顺便说一句,也没有.edmx文件。)

    这就是问题 - 如何告诉EF将域模型中的Home_TeamID字段写入表中的Home_TeamID列?

    我应该补充一点,那时我已经完成了另一次迁移,所以它不一定(仅仅)只需要回溯一个版本。

    编辑1: EF正在为Home_TeamID和Home_TeamID1列写入相同的团队ID,尽管它已将.ID1文件作为外键。

    我在我的项目中随处可见文本“ID1”(文本和二进制Unicode),它显示的唯一地方是* _migration.cs文件。

    与此同时,我尝试过上面的步骤1和2。现在(正如预期的那样)我得到了:

    InnerException: System.Data.SqlClient.SqlException HResult=-2146232060
    Message=Invalid column name 'Home_TeamID1'.
    Invalid column name 'Visitors_TeamID1'.
    

    编辑2:

    我试过了:

    1. 创建一个全新的(空白数据库)
    2. 从项目迁移中排除了所有.cs文件
    3. add-migration InitialRecreate
    4. 查看生成的.cs文件并删除对ID1的任何引用。 (事实上​​,有两个......他们来自哪里?)
    5. 在项目中查找并找到0个对ID1的引用。
    6. 更新的数据库
    7. 跑完项目
    8. 列名称'Home_TeamID1'无效。
    9. 显然问题不在于数据库本身。

1 个答案:

答案 0 :(得分:0)

这是一个软件胜过人类的案例。在我的"更高级别" GameSummary课,我有:

public int GameSummaryID { get; set; }
public int Home_TeamID { get; set; }
public virtual Team Home { get; set; }
public int Visitors_TeamID { get; set; }
public virtual Team Visitors { get; set; }

在团队课上,我有:

public int TeamID { get; set; }

因此EF创建了两列,一列用于Home_TeamID(GameSummary类中的字段Home_TeamID),另一列用于Home_TeamID(指向Team对象的导航属性的外键)。解决方案:

public int GameSummaryID { get; set; }
public int HomeTeamID { get; set; }
public virtual Team Home { get; set; }
public int VisitorsTeamID { get; set; }
public virtual Team Visitors { get; set; }