我读这大约播种的数据库,我想知道,如果我创建10个项目,我每次迁移或更新数据库时的种子,将其补种,所以,我现在有20个我的数据库中的项目?播种实体框架代码优先
我要种子X的项目,这是在我的数据库不变,我该怎么办呢?
THanks。
我读这大约播种的数据库,我想知道,如果我创建10个项目,我每次迁移或更新数据库时的种子,将其补种,所以,我现在有20个我的数据库中的项目?播种实体框架代码优先
我要种子X的项目,这是在我的数据库不变,我该怎么办呢?
THanks。
在你的种子方法中,你应该使用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会正确地认为它必须创建一个新行,从而复制数据。
简短的回答
为了保持十个项目,你将需要检查他们在你的种子法的存在。
稍长回答
:资源下载DbMigrationsConfiguration.Seed Method状态
注意数据库可能已经包含种子数据时,这种方法运行。这意味着此方法的实现必须检查种子数据是否存在和/或最新,然后仅在必要时以非破坏性方式进行更改。