我有一个简单的实体:
公共教室
{
[关键]
公共int Id{get;set;}
公共字符串名称[get;set;}
}
然后在Seed方法中,我使用AddOrUpdate填充表:
var hall1=新大厅{Name=“French”};
var hall2=新大厅{Name=“德语”};
var hall3=新大厅{Name=“Japanese”};
context.Halls.AddOrUpdate(
h=>;h.名称,
哈1,
嗨,2号,
哈尔3
);
然后我在包管理控制台中运行:
添加当前迁移
更新数据库
一切正常:我在表“Hall”中有三行。但是如果我再次在包管理控制台更新数据库中运行,我已经有五行了:
Id名称
1法语
2日语
3德语
4法语
5日语
为什么?我想应该是三行,而不是五行。我尝试使用Id属性而不是Name,但没有什么区别
更新:
此代码产生相同的结果:
var hall1=new Hall{Id=1,Name=“French”};
var hall2=新大厅{Id=2,Name=“德语”};
var hall3=新大厅{Id=3,Name=“Japanese”};
context.Halls.AddOrUpdate(
h=>;h.Id,
(1);
context.Halls.AddOrUpdate(
h=>;h.Id,
hall2);
context.Halls.AddOrUpdate(
h=>;h.Id,
hall3);
我还通过nuget安装了最新的EntityFramework
好的,我用这个在键盘上敲了一个小时。如果您的表的Id字段是一个标识字段,那么它将不起作用,所以请使用另一个用于identifierExpression。我使用了Name属性,还从new Hall{…}初始值设定项中删除了Id字段
对OPs代码的这一调整对我起到了作用,因此我希望它能帮助某些人:
受保护的覆盖无效种子(上下文)
{
context.Halls.AddOrUpdate(
h=>;h.Name,//使用Name(或其他唯一字段)而不是Id
新馆
{
Name=“大厅1”
},
新馆
{
Name=“2号厅”
});
SaveChanges();
}