2015-04-07 78 views
0

我想种子数据库与用户每个可以有列表。我如何在代码中添加角色列表{1,2,3}(即向用户添加“管理员”,“用户”...的角色)(即,我使用SelectMany func):创建用户和角色,而首先使用EF代码种子数据库

public class Role 
{ 
    public Role(string roleName, int roleType) 
    { 
     this.RoleName = roleName; 
     this.RoleType = roleType; 

    } 
    [Key] 
    public int RoleId { get; set; } 
    public string RoleName { get; set; } 
    public int RoleType { get; set; } 

} 
public class User 
{ 
    [Key]   
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public virtual ICollection<Role> Roles { get; set; } 

    public override string ToString() 
    { 
     return string.Format("[User UserId={0}, Name={1}, Age={2}, RolesCount={3}]", UserId, Name, Age, Roles.Count); 
    } 

} 

public class UserContext : DbContext 
{ 
    public DbSet<Role> Roles { get; set; } 
    public DbSet<User> Users { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //   modelBuilder.Entity<User>().HasMany(u => u.Roles).WithMany(r => r.Users) 
     //    .Map(m => m.MapLeftKey("UserId").MapRightKey("RoleId") 
     //      .ToTable("UserRole")); 
     Database.SetInitializer(new ContextInitialiser()) ; 
    } 


} 

public class ContextInitialiser: DropCreateDatabaseAlways<UserContext> 
{ 
    protected override void Seed(UserContext context) 
    { 
     CreateRole("Admin", 1, context); 
     CreateRole("SuperUser", 2, context); 
     CreateRole("User", 3, context); 
     CreateUser("Vovan Super", 31, context.Roles.SelectMany(r => r, (role, user) => new List<Role> (role))); 
     context.Users.ForEachAsync( Console.WriteLine); 
     base.Seed(context);   
    } 

    private void CreateUser(string name, int age, List<Role> roles, UserContext ctx) 
    { 
     ctx.Users.Add(new User {Name = name, Age = age, Roles = roles } ); 
    } 
    private void CreateRole(string roleName, int roleType, UserContext ctx) 
    { 
     ctx.Roles.Add(new Role(roleName, roleType)); 
    } 

} 
+0

因此,您不希望'foreach'遍历用户列表并为每个用户添加'User'和'Admin'角色,对吧? – renakre

+0

那么,在种子中,我创建了3个角色,并希望将其中的一些分配给某些用户(即用户具有角色列表);所以在将前三行种子角色置于上下文环境之后,我想添加(所有3个角色)给我创建的新用户(实际上大多是关于在范围中使用SelectMany func以及其他人们可以呈现的优雅解决方案的问题:) ) –

+0

删除了模板文本 –

回答

0
var roles = new List<Role>() 
{ 
new Role("Admin", 1), 
new Role("SuperUser", 2), 
new Role("User", 1) 
}; 
ctx.Roles.AddRange(roles); 
ctx.Users.Add(new User {Name = "Vovan Super", Age = 31, Roles = roles } ); 
ctx.SaveChanges(); 

应该这样做。

+0

好吧,它是:)但是你对如何描述的工作流的想法是什么?我们将角色添加到DbContext并立即从它中提取它们添加到用户,就像我尝试使用的那样的SelectMany;基本上,整体更多的是关于LINQ的问题,以及使用它的好技术(以及我认为最难理解的SelectMany功能) –

+0

由于您使用的是dropcreatealways策略,我不明白为什么您需要查询您有所有角色可用,我只是写一个where查询来选择角色的一个子集,如果我不需要为所有用户分配所有角色,因为你使用的角色类型(即时假设这将是唯一的),这将是最好的在此基础上进行查询。 – madan

+0

我觉得context.Roles.SelectMany应该是context.Roles.Local.SelectMany,第一个查询数据库的第二个本地更改还没有提交给db – madan

相关问题