2015-04-07 77 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

相關問題