2014-05-09 5 views
1

J'ai un problème dans EF 6 Code d'abord pendant que je fais de nombreuses approches relationnelles. Il ne remplira pas ma liste Tags et Posts.Beaucoup à plusieurs relation dans Entity Framework Code Premier 6

Ce que je suis en train de faire:

Poster

public class Post 
{ 
    public int PostID { get; set; } 

    public string Title { get; set; } 
    public string Description { get; set; } 

    public virtual Category Category { get; set; } 
    public int CategoryID { get; set; } 

    public virtual ICollection<Tag> Tags { get; set; } 
} 

Catégorie

public class Category 
{ 
    public int CategoryID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

Tag

public class Tag 
{ 
    public int TagID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

PostTagMap

public class PostTagMap 
{ 
    public virtual Post Post { get; set; } 
    [Key, Column(Order = 0)] 
    public int PostID { get; set; } 

    public virtual Tag Tag { get; set; } 
    [Key, Column(Order = 1)] 
    public int TagID { get; set; } 
} 

PostDbContext

public class PostDbContext : DbContext 
{ 
    public PostDbContext() 
    { 
     Database.SetInitializer(new PostDbContextInitializer()); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<Post> Post { get; set; } 
    public DbSet<Tag> Tag { get; set; } 
    public DbSet<Category> Category { get; set; } 

    public DbSet<PostTagMap> PostTagMap { get; set; } 
} 

PostDbContextInitializer

public class PostDbContextInitializer : DropCreateDatabaseIfModelChanges<PostDbContext> 
{ 
    protected override void Seed(PostDbContext context) 
    { 
     List<Category> listCategory = new List<Category> 
     { 
      new Category { Name = "Programming" }, 
      new Category { Name = "Designing" }, 
      new Category { Name = "Database" }, 
     }; 

     List<Tag> listTag = new List<Tag> 
     { 
      new Tag { Name = "Csharp" }, 
      new Tag { Name = "Asp.Net" }, 
      new Tag { Name = "Sencha Touch" }, 
      new Tag { Name = "MVC" }, 
      new Tag { Name = "SqlServer" }, 
      new Tag { Name = "Oracle" }, 
      new Tag { Name = "Bootstrap" }, 
      new Tag { Name = "Jquery" }, 
     }; 

     List<Post> listPost = new List<Post> 
     { 
      new Post { Title = "List Paging in Sencha Touch", Description = "In this one I am going to add one more important and most used functionality i.e. paging in sencha touch List.", Category = listCategory.Find(m => m.Name.Equals("Programming")) }, 
      new Post { Title = "CRUD Operation using Sencha Touch and ASP.Net MVC Web API", Description = "CRUD Operation using Sencha Touch and ASP.Net MVC Web API In this article I am going to explain and demonstrate how to create", Category = listCategory.Find(m => m.Name.Equals("Programming")) }, 
      new Post { Title = "Union Example in SQL Server", Description = "In this article I am going to explain a use of union operator in SQL Server Database with a real life scenario and example. The UNION operator is used to combine the result-set of two or more SELECT statements.", Category = listCategory.Find(m => m.Name.Equals("Database")) }, 
      new Post { Title = "Pivot with Dynamic columns in SQL Server", Description = "Pivot with Dynamic columns in SQL Server In this article I will present how we can write a Dynamic PIVOT.", Category = listCategory.Find(m => m.Name.Equals("Database")) }, 
     }; 

     List<PostTagMap> listPostTagMap = new List<PostTagMap> 
     { 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("List Paging in Sencha Touch")), Tag = listTag.Find(m => m.Name.Equals("Sencha Touch")) }, 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("List Paging in Sencha Touch")), Tag = listTag.Find(m => m.Name.Equals("Asp.Net")) }, 

      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("CRUD Operation using Sencha Touch and ASP.Net MVC Web API")), Tag = listTag.Find(m => m.Name.Equals("Sencha Touch")) }, 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("CRUD Operation using Sencha Touch and ASP.Net MVC Web API")), Tag = listTag.Find(m => m.Name.Equals("Asp.Net")) }, 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("CRUD Operation using Sencha Touch and ASP.Net MVC Web API")), Tag = listTag.Find(m => m.Name.Equals("MVC")) }, 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("CRUD Operation using Sencha Touch and ASP.Net MVC Web API")), Tag = listTag.Find(m => m.Name.Equals("Csharp")) }, 

      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("Union Example in SQL Server")), Tag = listTag.Find(m => m.Name.Equals("SqlServer")) }, 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("Union Example in SQL Server")), Tag = listTag.Find(m => m.Name.Equals("Oracle")) }, 

      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("Pivot with Dynamic columns in SQL Server")), Tag = listTag.Find(m => m.Name.Equals("Oracle")) }, 
      new PostTagMap { Post = listPost.Find(m => m.Title.Equals("Pivot with Dynamic columns in SQL Server")), Tag = listTag.Find(m => m.Name.Equals("SqlServer")) }, 
     }; 

     listCategory.ForEach(m => 
     { 
      context.Category.Add(m); 
     }); 
     context.SaveChanges(); 

     listTag.ForEach(m => 
     { 
      context.Tag.Add(m); 
     }); 
     context.SaveChanges(); 

     listPost.ForEach(m => 
     { 
      context.Post.Add(m); 
     }); 
     context.SaveChanges(); 

     listPostTagMap.ForEach(m => 
     { 
      context.PostTagMap.Add(m); 
     }); 
     context.SaveChanges(); 

     base.Seed(context); 
    } 
} 

Le tout ce qui précède fonctionne entrée fine et base de données serait également correcte. Mais le problème se produit lorsque j'essaie de récupérer un jeu de résultats dans Controller. Il ne remplira pas la liste des balises dans la liste des messages et messages de Tag.

public class HomeController : Controller 
{ 
    PostDbContext db = new PostDbContext(); 

    public ActionResult Index() 
    { 
     //var posts = db.Post.ToList(); 

     var posts = db.Post.Include(m => m.Tags).ToList(); 
     var tags = db.Tag.ToList(); 
     var categories = db.Category.ToList(); 

     return View(posts); 
    } 
} 

Aidez-moi s'il vous plaît. Comment puis-je atteindre cet objectif?

Répondre

1

Vous n'avez pas besoin de créer une table PostTagMap explicitement. Entity framework créera la table de jointure pour vous et comme vous utilisez les propriétés de navigation (ICollection, etc.). Essayez d'ajouter une liste d'étiquettes directement à l'un de vos messages dans la méthode Seed. Cela devrait apparaître dans votre vue Index.

code:

public class Post 
{ 
    public int PostID { get; set; } 

    public string Title { get; set; } 
    public string Description { get; set; } 

    public virtual Category Category { get; set; } 
    public int CategoryID { get; set; } 

    public virtual ICollection<Tag> Tags { get; set; } 
} 

public class Category 
{ 
    public int CategoryID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

public class Tag 
{ 
    public int TagID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

public class PostDbContext : DbContext 
{ 
    public PostDbContext() 
    { 
     Database.SetInitializer(new PostDbContextInitializer()); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     modelBuilder.Entity<Post>().HasMany<Tag>(s => s.Tags).WithMany(c => c.Posts).Map(m => 
     { 
      m.MapLeftKey("PostID"); 
      m.MapRightKey("TagID"); 
      m.ToTable("PostTagMap"); 
     }); 

     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<Post> Post { get; set; } 
    public DbSet<Tag> Tag { get; set; } 
    public DbSet<Category> Category { get; set; } 
} 

public class PostDbContextInitializer : DropCreateDatabaseIfModelChanges<PostDbContext> 
{ 
    protected override void Seed(PostDbContext context) 
    { 
     List<Category> listCategory = new List<Category> 
     { 
      new Category { Name = "Programming" }, 
      new Category { Name = "Designing" }, 
      new Category { Name = "Database" }, 
     }; 

     List<Tag> listTag = new List<Tag> 
     { 
      new Tag { Name = "Csharp" }, 
      new Tag { Name = "Asp.Net" }, 
      new Tag { Name = "Sencha Touch" }, 
      new Tag { Name = "MVC" }, 
      new Tag { Name = "SqlServer" }, 
      new Tag { Name = "Oracle" }, 
      new Tag { Name = "Bootstrap" }, 
      new Tag { Name = "Jquery" }, 
     }; 

     List<Post> listPost = new List<Post> 
     { 
      new Post { Title = "List Paging in Sencha Touch", Description = "In this one I am going to add one more important and most used functionality i.e. paging in sencha touch List.", Category = listCategory.Find(m => m.Name.Equals("Programming")), Tags = listTag.Where(x => x.Name.Equals("Sencha Touch") || x.Name.Equals("Asp.Net")).ToList() }, 
      new Post { Title = "CRUD Operation using Sencha Touch and ASP.Net MVC Web API", Description = "CRUD Operation using Sencha Touch and ASP.Net MVC Web API In this article I am going to explain and demonstrate how to create", Category = listCategory.Find(m => m.Name.Equals("Programming")) }, 
      new Post { Title = "Union Example in SQL Server", Description = "In this article I am going to explain a use of union operator in SQL Server Database with a real life scenario and example. The UNION operator is used to combine the result-set of two or more SELECT statements.", Category = listCategory.Find(m => m.Name.Equals("Database")) }, 
      new Post { Title = "Pivot with Dynamic columns in SQL Server", Description = "Pivot with Dynamic columns in SQL Server In this article I will present how we can write a Dynamic PIVOT.", Category = listCategory.Find(m => m.Name.Equals("Database")) }, 
     }; 

     listCategory.ForEach(m => 
     { 
      context.Category.Add(m); 
     }); 
     context.SaveChanges(); 

     listTag.ForEach(m => 
     { 
      context.Tag.Add(m); 
     }); 
     context.SaveChanges(); 

     listPost.ForEach(m => 
     { 
      context.Post.Add(m); 
     }); 
     context.SaveChanges(); 

     base.Seed(context); 
    } 
} 
Questions connexes