Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架说我正在尝试用同一个键插入多个实体,但我不这么认为_C#_Entity Framework - Fatal编程技术网

C# 实体框架说我正在尝试用同一个键插入多个实体,但我不这么认为

C# 实体框架说我正在尝试用同一个键插入多个实体,但我不这么认为,c#,entity-framework,C#,Entity Framework,我使用EF进行代码优先迁移。更新数据库时,我在Nuget控制台中收到以下错误消息: 检测到冲突的更改。当尝试插入具有相同密钥的多个实体时,可能会发生这种情况 下面是我的config.cs文件和Seed方法: internal sealed class Configuration : DbMigrationsConfiguration<MiracleMachine.data.ApplicationDbContext> { public Configuration() {

我使用EF进行代码优先迁移。更新数据库时,我在Nuget控制台中收到以下错误消息:

检测到冲突的更改。当尝试插入具有相同密钥的多个实体时,可能会发生这种情况

下面是我的config.cs文件和Seed方法:

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中。我不知道这是怎么回事。