简体   繁体   English

如何在实体框架中添加种子方法

[英]how to add seed method in entity framework

I'm trying to run code-first migrations with Entity Framework.我正在尝试使用实体框架运行代码优先迁移。 I enable, add, and update.我启用、添加和更新。 When I update, it says it runs the seed method and there are no errors, but when I look at the data in the tables, there isn't any.当我更新时,它说它运行种子方法并且没有错误,但是当我查看表中的数据时,没有任何错误。

Here is my Seeder:这是我的播种机:

public static class Seeder
{
    public static void Seed(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.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!"
            });

        //////////////////////////////////////////// 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 = "Greenwald",
                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 = "Cellz",
                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();
    }
}

And here is my DbContext:这是我的 DbContext:

public ApplicationDbContext()
    : base("DefaultConnection", throwIfV1Schema: false)
{
    this.Configuration.LazyLoadingEnabled = false;
}

public static ApplicationDbContext Create()
{
    return new ApplicationDbContext();
}
public IDbSet<Prop> Props { get; set; }
public IDbSet<Theory> Theories { get; set; }
public IDbSet<NewTrick> NewTricks { get; set; }

I'm not quite sure what I'm doing wrong here.我不太确定我在这里做错了什么。 I'm glad to provide any info I might be missing.我很高兴提供我可能遗漏的任何信息。

you should add a configuration class like你应该添加一个配置类

internal class Configuration : DbMigrationsConfiguration<ApplicationDbContext>
{
    protected override void Seed(ApplicationDbContext context)
    {
          //seed code here
    }
}

and then have an initializer class like然后有一个初始化类

public class MyInitializer : MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>
{
}

and at the end set the initializer for your EF database in your application startup最后在应用程序启动时为 EF 数据库设置初始值设定项

Database.SetInitializer(new MyInitializer());

You have added UserRole to UserManager twice using the following line of code userManager.AddToRole(user1.Id, "User") This might be the cause for the conflict.您已使用以下代码userManager.AddToRole(user1.Id, "User") UserRole 添加到 UserManager 两次userManager.AddToRole(user1.Id, "User")这可能是冲突的原因。

To be exact copy the above code you posted, on a new file and look at line number 159 and 184.确切地说,将您发布的上述代码复制到一个新文件中,然后查看第 159 行和第 184 行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM