C# 实体框架说我正在尝试用同一个键插入多个实体,但我不这么认为
我使用EF进行代码优先迁移。更新数据库时,我在Nuget控制台中收到以下错误消息: 检测到冲突的更改。当尝试插入具有相同密钥的多个实体时,可能会发生这种情况 下面是我的config.cs文件和Seed方法:C# 实体框架说我正在尝试用同一个键插入多个实体,但我不这么认为,c#,entity-framework,C#,Entity Framework,我使用EF进行代码优先迁移。更新数据库时,我在Nuget控制台中收到以下错误消息: 检测到冲突的更改。当尝试插入具有相同密钥的多个实体时,可能会发生这种情况 下面是我的config.cs文件和Seed方法: internal sealed class Configuration : DbMigrationsConfiguration<MiracleMachine.data.ApplicationDbContext> { public Configuration() {
internal sealed class Configuration : DbMigrationsConfiguration<MiracleMachine.data.ApplicationDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MiracleMachine.data.ApplicationDbContext context)
{
context.Props.AddOrUpdate(
p => p.PropId,
new Prop() { PropName = "sharpie" },
new Prop() { PropName = "coin" },
new Prop() { PropName = "playing cards" },
new Prop() { PropName = "coffee mug" },
new Prop() { PropName = "phone" },
new Prop() { PropName = "keys" },
new Prop() { PropName = "sunglasses" },
new Prop() { PropName = "headphones" },
new Prop() { PropName = "ring" },
new Prop() { PropName = "lighter" }
);
context.SaveChanges();
context.Theories.AddOrUpdate(
t => t.TheoryId,
new Theory()
{
// TheoryId = 0,
TheoryName = "Production",
TheoryDescription = "Make it appear out of nowhere!"
},
new Theory()
{
// TheoryId = 1,
TheoryName = "Vanish",
TheoryDescription = "Make it vanish into thin air!"
},
new Theory()
{
// TheoryId = 2,
TheoryName = "Transportation",
TheoryDescription = "Make it vanish, and then reappear somewhere impossible!"
},
new Theory()
{
// TheoryId = 3,
TheoryName = "Transformation", // This uses TWO props
TheoryDescription = "Cause one of these items to change into the other item!"
},
new Theory()
{
// TheoryId = 4,
TheoryName = "Multiplication",
TheoryDescription = "Magically duplicate this item again and again!"
},
new Theory()
{
// TheoryId = 5,
TheoryName = "Penetration", // This uses TWO props
TheoryDescription = "Cause the two items to inexplicably pass through each other"
},
new Theory()
{
// TheoryId = 6,
TheoryName = "Restoration",
TheoryDescription = "Destroy the item in some way. Restore it."
},
new Theory()
{
// TheoryId = 7,
TheoryName = "Levitation",
TheoryDescription = "Make the item float in mid-air!"
});
context.SaveChanges();
//////////////////////////////////////////// The following seeds user data
// ApplicationUser table seeder
UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>(context);
UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(userStore);
RoleStore<Role> roleStore = new RoleStore<Role>(context);
RoleManager<Role> roleManager = new RoleManager<Role>(roleStore);
if (!roleManager.RoleExists("Admin"))
roleManager.Create(new Role { Name = "Admin" });
if (!roleManager.RoleExists("User"))
roleManager.Create(new Role { Name = "User" });
IdentityResult result = null; // Sets the result to null. Used for error checking.
/////////// Admin (1)
ApplicationUser admin1 = userManager.FindByName("MagicRawb");
if (admin1 == null)
{
admin1 = new ApplicationUser
{
FirstName = "Rob",
LastName = "Greenlee",
UserName = "magicrawb",
Email = "magicrawb@test.com",
Gender = Gender.Male
};
}
result = userManager.Create(admin1, "asdfasdf");
if (!result.Succeeded)
{
string error = result.Errors.FirstOrDefault();
throw new Exception(error);
}
userManager.AddToRole(admin1.Id, "Admin"); // Add user1 to Admin role
admin1 = userManager.FindByName("magicrawb"); // Assign user1 data to variable user1
/////////// Admin (2)
ApplicationUser admin2 = userManager.FindByName("admin2");
if (admin2 == null)
{
admin2 = new ApplicationUser
{
FirstName = "Bekah",
LastName = "Sells",
UserName = "admin2",
Email = "admin2@test.com",
Gender = Gender.Female
};
}
result = userManager.Create(admin2, "asdfasdf");
if (!result.Succeeded)
{
string error = result.Errors.FirstOrDefault();
throw new Exception(error);
}
userManager.AddToRole(admin2.Id, "Admin"); // Add user1 to Admin role
admin1 = userManager.FindByName("admin2"); // Assign user1 data to variable user1
/////////// User (1)
ApplicationUser user1 = userManager.FindByName("user1");
if (user1 == null)
{
user1 = new ApplicationUser
{
FirstName = "Lance",
LastName = "Burton",
UserName = "user1",
Email = "user1@test.com",
Gender = Gender.Male
};
}
result = userManager.Create(user1, "asdfasdf");
if (!result.Succeeded)
{
string error = result.Errors.FirstOrDefault();
throw new Exception(error);
}
userManager.AddToRole(user1.Id, "User"); // Add user1 to Admin role
user1 = userManager.FindByName("user1"); // Assign user1 data to variable user1
/////////// User (2)
ApplicationUser user2 = userManager.FindByName("user2");
if (user2 == null)
{
user2 = new ApplicationUser
{
FirstName = "David",
LastName = "Stone",
UserName = "user2",
Email = "user2@test.com",
Gender = Gender.Male
};
}
result = userManager.Create(user2, "asdfasdf");
if (!result.Succeeded)
{
string error = result.Errors.FirstOrDefault();
throw new Exception(error);
}
userManager.AddToRole(user1.Id, "User"); // Add user1 to Admin role
user2 = userManager.FindByName("user2"); // Assign user1 data to variable user1
context.SaveChanges();
Database.SetInitializer(new MyInitializer());
}
}
internal class MyInitializer : MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>
{
}
}
我将理论和道具的Id设置为我认为EF会自动生成的键。我没有为道具设置任何道具,并在理论上对它们进行了注释,因此我对发生的事情感到有点困惑。在AddOrUpdate方法中,您使用了一个字段来匹配,但您从未设置它 您应该设置id,或者使用另一个字段进行匹配。例:
context.Props.AddOrUpdate(
p => p.PropName,
new Prop() { PropName = "sharpie" },
new Prop() { PropName = "coin" },
new Prop() { PropName = "playing cards" },
new Prop() { PropName = "coffee mug" },
new Prop() { PropName = "phone" },
new Prop() { PropName = "keys" },
new Prop() { PropName = "sunglasses" },
new Prop() { PropName = "headphones" },
new Prop() { PropName = "ring" },
new Prop() { PropName = "lighter" });
请创建一个SSCCE。我查过了,我真的不知道怎么做。包括整个项目?包括较少的代码;只应包括与问题相关并证明问题的代码。在上下文中显示添加或删除时导致问题的代码。在构建SSCCE时,我经常会“发现我自己的问题”,这是一个很好的例子,因为在这个过程中,不相关的代码位会被删除,直到核心问题被清晰地识别出来。我需要花一些时间来运行每一行,以找出是哪一行导致了这个问题。它不会弄乱我已经有的数据库表吗?我是否只是删除数据库并重新启动每一行?一旦我弄明白了怎么做,我会发布另一个问题。你使用TheoryId作为AddOrUpdate的键,但你从来没有设置TheoryId。这帮不了忙…我把这个改成了p.PropName,还取消了TheoryId的注释。仍然得到相同的多个实体错误,那么它可能在userStore或roleStore中。我不知道这是怎么回事。