在Configuration.cs中播种数据,使用AddOrUpdate创建重复数据

时间:2013-05-17 11:57:59

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first

我正在使用Code First在Visual Studio 2012 Express中使用SQL Server 2012 Express的MVC 4 EF5应用程序中使用迁移。

我在configuration.cs中使用Seed方法,首先创建一个Tags表。当我从Package Manager执行'Update-Database -verbose -force'时,它可以正常工作,不会创建重复的标记 - 如果删除则重新创建它们:

db.Tags.AddOrUpdate(
   t => t.Name,
   new Tag { Name = "Bakery", NamePlural = "Bakeries" },
   new Tag { Name = "Bar", NamePlural = "Bars" },
   new Tag { Name = "Bookshop", NamePlural = "Bookshops" }
);

db.SaveChanges();

然后我尝试添加相关的地方数据:

db.Places.AddOrUpdate(
p => p.Name,
new Place
{
  Name = "Shoreditch Grind",
  URL = "shoreditch-grind-cafe",
  Address = "213 Old St",
  City = "London",
  PostCode = "EC1V 9NR",
  Website = "www.shoreditchgrind.com",
  Phone = "020 7490 0101",
  About = "Good coffee on the Silicon Roundabout",
  Image = "noimage.png",
  Tag = db.Tags.Single(t => t.Name == "Bar")
},

new Place
{
  Name = "The Old Blue Last",
  URL = "old-blue-last-pub",
  Address = "38 Great Eastern St",
  City = "London",
  PostCode = "EC2A 3ES",
  Website = "www.theoldbluelast.com",
  Phone = "020 7739 7033",
  About = "Pub of Vice Magazine",
  Image = "noimage.png",
  Tag = db.Tags.Single(t => t.Name == "Bakery")
}
);

然而,这会产生重复,每次执行'Update-Database -verbose -force'时都会再次添加所有位置

我是MVC的新手 - 我也不完全明白这是做什么的:

p => p.Name,

我觉得我应该手动为每个对象添加ID值吗?

如何在不创建重复的地方的情况下运行此操作?

能够将每个Tag.Name标记为唯一,这也很有用。

感谢。

1 个答案:

答案 0 :(得分:3)

这可能有效:

var place = new Place
{
  Name = "The Old Blue Last",
  URL = "old-blue-last-pub",
  Address = "38 Great Eastern St",
  City = "London",
  PostCode = "EC2A 3ES",
  Website = "www.theoldbluelast.com",
  Phone = "123 456 789",  // updated number
  About = "Pub of Vice Magazine",
  Image = "noimage.png",
  TagID = db.Tags.Single(t => t.Name == "Bakery").TagID
};
db.Places.AddOrUpdate(p => p.Name, place);
db.SaveChanges();

由于“The Old Blue Last”已经存在,并且我们已根据p.Name进行了更新,因此它应该只更新该条目,将Phone更改为“123 456 789”。这与您尝试的类似,但可能有效。查看更多here

您还提到您不确定p => p.Name的作用。 =>称为Lambda表达式。这是一个匿名函数。它是一个没有声明,访问修饰符,返回类型,名称等的方法。它是一个简短的表达式,允许您在要使用它的位置编写方法。

查看更多herehere.