播种实体框架代码第一

时间:2016-06-06 22:26:43

标签: asp.net asp.net-mvc entity-framework

我正在阅读有关播种数据库的内容,我想知道,如果我创建一个包含10个项目的种子,每次迁移或更新数据库时,是否会重新播种,以便我现在在数据库中有20个项目?

我想播种X项目,这些项目在我的数据库中是常量,我该怎么做?

感谢。

Seeding Tutorial

2 个答案:

答案 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)

简短的回答 为了保留10个项目,您需要检查它们在Seed方法中的存在。 答案稍微长一些 Msdn DbMigrationsConfiguration.Seed方法说明   请注意,此方法运行时,数据库可能已包含种子数据。这意味着此方法的实现必须检查种子数据是否存在和/或是最新的,然后仅在必要时以非破坏性方式进行更改。