我尝试使用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; }
我不太确定我在这里做错了什么。我很高兴提供我可能遗失的任何信息。
答案 0 :(得分: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());
答案 1 :(得分:0)
您已使用以下代码行userManager.AddToRole(user1.Id, "User")
将UserRole添加到UserManager两次这可能是导致冲突的原因。
准确复制您发布的上述代码,在新文件中查看第159和184行。