将现有列值添加为模型上的新属性

时间:2014-07-15 20:50:14

标签: entity-framework ef-code-first

所以我相信我搞砸了我的初始模型,错过了ID和外键属性。 无论如何,实体框架已经解决了这个问题....但现在我想修复我的模型以正确反映这一点。

最初我的模特是: -

public Season
{
    public int SeasonId {get; set;}
    public int Year {get; set;}

    public virtual ICollection<MatchFixture> MatchFixtures {get; set;}
}

public MatchFixture
{
    public int MatchFixtureId {get; set;}

    public int Round {get; set;}
    public string HomeTeam {get; set;}
    public string AwayTeam {get; set;}
}

现在我相信我应该让MatchFixture具有属性,因此它指向包含它的Season,将以下属性添加到MatchFixture。

public int SeasonId {get; set;}
public Season Season {get; set;}

但问题是我的数据库已在我的MatchFixtures中有一个名为Season_SeasonId的列。这是一个可以为空的整数列,显然来自我在Season中的包含集合。如果我最初在MatchFixture中拥有上面的属性,那么该列将被称为SeasonId,并且是不可为空的整数列。

我想要的是将该列中的值传输到我的新列....

  1. 如何使用CodeFirst迁移执行此操作?我应该重命名该列,并将其更改为不可空,我们已经完成了吗?
  2. 我是否应该添加这些属性?我发现它使我的代码更容易导航和层次结构&#39; (即哪个季节MatchFixture存在于?matchFixture.Season中,但我觉得这是一个更大问题的一部分,我对实体框架的理解阻碍了我。

1 个答案:

答案 0 :(得分:0)

您可以一步完成,但您需要首先确保数据库中没有NULL Season_SeasonId值,如果您需要对其执行某些操作,或者删除它或设置外键值。

只需在MatchFixture上添加这些属性。

public int SeasonId { get; set; }
public Season Season { get; set; }

然后启用,添加并运行迁移。

PM> Enable-Migrations
PM> Add-Migration AddMatchFixtureFK
PM> Update-Database

然后你就拥有了所需的一切。

如果您检查AddMatchFixtureFK迁移,Up方法将完成所有必要步骤。

- Drop Foreign Key
- Drop Index
- Rename Column
- Alter Column (to non null-able)
- Create Index
- Add Foreign Key

是否需要添加这些属性,this post中已对此进行了解释。 但有一件事我发现添加这些导航属性(id和reference)会使数据操作和种子数据变得更容易。例如,您只需设置MatchFixture即可向现有Season添加新的SeasonId