2014-05-09 130 views
1

我在EF 6 Code First中遇到问题,而我正在执行多对多的关系方法。它不会填充我的标签和帖子列表。实体框架中的多对多关系代码优先6

我所试图做的事:

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

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

上述一切工作正常和数据库条目也将是正确的。但是当我尝试在Controller中检索结果集时发生问题。它不会在标签中的帖子和帖子列表中填充标签列表。

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

请帮帮我。我怎样才能做到这一点?

回答

1

您不需要明确地创建PostTagMap表。实体框架将为您创建连接表,并且您正在使用导航属性(ICollection等)。尝试在Seed方法中直接添加标签列表到您的某个帖子。这应该会显示在您的索引视图中。

代码:

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); 
    } 
} 
相关问题