【发布时间】:2012-04-17 22:31:38
【问题描述】:
我有简单的实体:
public class Hall
{
[Key]
public int Id {get; set;}
public string Name [get; set;}
}
然后在Seed 方法中我使用AddOrUpdate 来填充表格:
var hall1 = new Hall { Name = "French" };
var hall2 = new Hall { Name = "German" };
var hall3 = new Hall { Name = "Japanese" };
context.Halls.AddOrUpdate(
h => h.Name,
hall1,
hall2,
hall3
);
然后我在包管理控制台中运行:
Add-Migration Current
Update-Database
没关系:我在“Hall”表中有三行。但如果我再次在包管理控制台Update-Database 中运行,我已经有五行了:
Id Name
1 French
2 Japaneese
3 German
4 French
5 Japanese
为什么?我认为应该是三排,而不是五排。我尝试使用Id 属性而不是Name,但这并没有什么不同。
更新:
此代码产生相同的结果:
var hall1 = new Hall { Id = 1, Name = "French" };
var hall2 = new Hall { Id = 2, Name = "German" };
var hall3 = new Hall { Id = 3, Name = "Japanese" };
context.Halls.AddOrUpdate(
h => h.Id,
hall1);
context.Halls.AddOrUpdate(
h => h.Id,
hall2);
context.Halls.AddOrUpdate(
h => h.Id,
hall3);
我还通过 nuget 安装了最新的 EntityFramework。
【问题讨论】:
-
如果您对每条记录单独调用
AddOrUpdate会发生什么?你有5条记录很奇怪。这意味着它工作过一次,所以你一定有一些特别的东西。 -
@Ladislav Mrnka:单独通话也是如此。
-
非常感谢。我已经看过这个页面了。不幸的是,我在这篇文章中没有发现任何有趣的东西可以解决我的问题。
-
在下面查看我的答案。我花了几个小时调试这个,这是因为我通过覆盖我的上下文文件中的 SaveChanges() 方法来修改实体状态信息。完整解释如下。使用种子方法填充数据库不需要通过 Id 进行任何查找——重点是让事情变得简单,最后我能够通过查找除 Id 之外的属性名称来弄清楚如何使这项工作正常进行。我们不应该在这个种子方法中管理 Id 列。
标签: c# .net entity-framework-4