【问题标题】:how to add seed method in entity framework如何在实体框架中添加种子方法
【发布时间】:2015-09-12 18:40:53
【问题描述】:

我正在尝试使用 Entity Framework 运行代码优先迁移。我启用、添加和更新。当我更新时,它说它运行种子方法并且没有错误,但是当我查看表中的数据时,没有任何错误。

这是我的播种机:

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();
    }
}

这是我的 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; }

我不太确定我在这里做错了什么。我很高兴提供我可能遗漏的任何信息。

【问题讨论】:

  • 你应该告诉 EF 运行你的 Seed 方法!
  • 我不确定你的意思。 Seeder.Seed(上下文);在 configuration.cs 文件中?
  • 您还可以将 Seed 方法添加到您的初始化程序中(代替迁移初始化程序,或者除了迁移初始化程序之外)。您实际上可以调试此代码并查看它在哪里出错。 blog.oneunicorn.com/2013/05/28/…

标签: c# .net entity-framework entity-framework-migrations


【解决方案1】:

你应该添加一个类似的配置类

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

然后有一个像

这样的初始化类
public class MyInitializer : MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>
{
}

最后在应用程序启动时为 EF 数据库设置初始化程序

Database.SetInitializer(new MyInitializer());

【讨论】:

  • 刚刚这样做,当我更新数据库时,我得到:检测到冲突更改。尝试插入具有相同键的多个实体时可能会发生这种情况。
  • 这是一个好兆头,表明您的种子方法正在运行。您应该检查种子代码以查看问题所在。该错误几乎是不言自明的。
  • 酷。老实说,我没有看到我在哪里使用相同的键插入多个实体。对象键都是它们的 ID,我没有设置它们。我为理论做了,但把它们注释掉了,所以实体会自动做。
  • 这是一个全新的问题。请在新问题中提出。
【解决方案2】:

您已使用以下代码行 userManager.AddToRole(user1.Id, "User") 将 UserRole 添加到 UserManager 两次,这可能是导致冲突的原因。

准确地复制您发布的上述代码,在一个新文件中查看第 159 和 184 行。

【讨论】:

  • 哦,哇,我不敢相信我没听懂!我更改了它,但仍然收到:“检测到冲突的更改。尝试使用相同的键插入多个实体时可能会发生这种情况。”
  • 是的,这可能是原因。设置一个断点,然后尝试调试代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多