我正在阅读有关播种数据库的内容,我想知道,如果我创建一个包含10个项目的种子,每次迁移或更新数据库时,是否会重新播种,以便我现在在数据库中有20个项目?
我想播种X项目,这些项目在我的数据库中是常量,我该怎么做?
感谢。
答案 0 :(得分: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
,并且已创建上述数据。然后你改变了#34;美国"到美国"。像这样:
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
(第一个参数)。原因是ID通常使用IDENTITY规范,这意味着它的值由数据库生成。因此,它不是确定匹配行的可靠方法。我已经多次看到过这种情况,结果总是在数据库中重复记录。
为清楚起见,不要做这个:
context.Foos.AddOrUpdate(
x => x.Id,
new Foo { Id = 1, Value = "Don't do this" });
创建行时,不会使用放入对象初始值设定项的ID。将使用生成的值。但是,当EF尝试稍后查找匹配项(用于更新)时,将使用您指定的的ID 。 ID很不可能匹配,EF会认为必须创建新行,从而复制数据。
答案 1 :(得分:0)