2016-06-06 210 views
1

我读这大约播种的数据库,我想知道,如果我创建10个项目,我每次迁移或更新数据库时的种子,将其补种,所以,我现在有20个我的数据库中的项目?播种实体框架代码优先

我要种子X的项目,这是在我的数据库不变,我该怎么办呢?

THanks。

Seeding Tutorial

回答

1

在你的种子方法中,你应该使用AddOrUpdate方法。

想象一下,你正在填充国家表。你会在你的种子法这样的代码:

context.Countries.AddOrUpdate(
    c => c.Code, 
    new Country { Code = "CA", Description = "Canada" }, 
    new Country { Code = "US", Description = "United States" }); 

每次运行此代码EF将查询数据库,查看是否有匹配Code列中存在一个国家的时间。如果不是,它将执行INSERT,否则它将尝试使用种子方法中的当前值更新Country。

比方说,你已经运行update-database和上面的数据已经建立。然后你将“美国”改为“美国”。就像这样:

context.Countries.AddOrUpdate(
    c => c.Code, 
    new Country { Code = "CA", Description = "Canada" }, 
    new Country { Code = "US", Description = "United States of America" }); 

运行update-database EF不会创建一个新的国家行的下一个时间。它只会用Code == "US"更新现有的行。

还有一点要注意的是不是使用c => c.Id作为您的identifierExpression(第一个参数)。原因在于Ids通常使用IDENTITY规范,这意味着它的值由数据库生成。因此它不是确定匹配行的可靠方式。我已经多次看到这一点,并且结果总是在数据库中重复记录。

所以为了清楚起见,不要做:

context.Foos.AddOrUpdate(
    x => x.Id, 
    new Foo { Id = 1, Value = "Don't do this" }); 

创建行时你把对象初始化的编号将不会被使用。生成的值将被用来代替。但是,EF在稍后尝试查找匹配项(用于更新)时,将使用指定的ID。这些ID不太可能匹配,EF会正确地认为它必须创建一个新行,从而复制数据。

0

简短的回答

为了保持十个项目,你将需要检查他们在你的种子法的存在。

稍长回答

:资源下载DbMigrationsConfiguration.Seed Method状态

注意数据库可能已经包含种子数据时,这种方法运行。这意味着此方法的实现必须检查种子数据是否存在和/或最新,然后仅在必要时以非破坏性方式进行更改。