2016-03-22 27 views
0

首先,我敢肯定,这一定是以前曾经问过的,但一直无法通过谷歌搜索找到确切的答案,所以请耐心等待。实体框架:添加列需要更改种子数据?

我已经继承了使用迁移的代码第一个实体框架项目。我添加了一个(非空的)列一个表,我需要值插入此列的所有现有项目 - 这是不是默认值:

public override void Up() 
{ 
    AddColumn("dbo.QuestionType", "Duplicated", c => c.Boolean(nullable: false, defaultValue: false)); 
    Sql("UPDATE dbo.QuestionType SET Duplicated = 1"); 
} 

但是这里原是增加了一些种子数据到此表:

context.QuestionTypes.AddOrUpdate(
       e => e.Name, 
       new QuestionType() { Name = QuestionTypeNames.INTERVIEWER}); 

这意味着更新语句会立即被调用Seed方法中的数据覆盖(在每次迁移后调用)。

我的问题是:

  1. 是否“安全”简单地添加额外的价值到种子数据(或将导致这一切打破早期移民在新的列上不存在数据库)。
  2. 或者有什么办法可以防止在迁移之后运行Seed方法(以及所有后续的迁移)。

感谢

回答

1

实体框架是伟大的,但要能有效地使用它,恐怕我们真的别无选择,只能在确保该迁移和种子法是勤奋同步并且彼此良好地工作。

  1. 是的,如果你把新的值在种子(即new QuestionType() { Name = QuestionTypeNames.INTERVIEWER, Duplicated = true}),这将导致不具有最新的迁移应用,打破系统。这是因为种子方法会寻找Duplicated列,但不会找到它。

  2. 不,我不认为有办法做到这一点,至少不会自动。一种解决方法是:由于您可以访问种子方法中的context对象,因此只需查询数据库以检查特定迁移是否已存在。然后,您可以使用前面的查询结果将QuestionTypes的特定播种器包装在if语句中。

+0

感谢您确认这一点 - 我没有想过检查迁移是否已应用,听起来像一个可行的方法。仔细查看Seed方法中添加的数据后,有些数据不应该存在(硬编码密码等),所以可能会发现我最好的办法就是从Seed中删除数据方法完全... –

+0

复制将始终存在,因为在运行Seed()之前应用了迁移。 –