asp.net mvc 4多对多关系如何插入数据

时间:2013-06-05 21:57:12

标签: asp.net-mvc asp.net-mvc-4 insert many-to-many

如何在多对多关系中插入数据? 我有这个代码定义的这两个模型

public class Article
{
    public int ArticleID { get; set; }
    public string Title { get; set; }
    public DateTime Date { get; set; }
    public string Anotation { get; set; }
    public string Body { get; set; }
    public virtual ICollection<ArticleTag> ArticleTags { get; set; }
}

public class ArticleTag
{
    public int ArticleTagID { get; set; }
    public string TagName { get; set; }
    public virtual ICollection<Article> Articles { get; set; }
}    

现在,大问题是如何使用测试数据为数据库设定种子。我有一些正常的表和查询的经验,在MVC EF我是一个相当新手。通常我会创建一个关联表,并在其中定义这些模型之间的链接。但是我已经阅读了很多教程,没有人给我一个确定性的方法,所以我可以想象我的困惑。

正如我之前所说的,我通过模型构建器“创建”了一个关联表,这就是我结束的地方:(

public class DatabaseContext : DbContext
{
    public DbSet<Article> Articles { get; set; }
    public DbSet<ArticleTag> ArticleTags { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Article>().
            HasMany(at => at.ArticleTags).WithMany(a => a.Articles).
            Map(m => m.MapLeftKey("ArticleID").MapRightKey("ArticleTagID").ToTable("Articles_To_ArticleTags"));
    }
}

我需要知道种子数据库的最简单方法(不必关心是否必须删除关联表)并了解它在MVC中的工作方式 - 链接两个模型,链接两个特定实例,...,以及如何编写所有代码。

任何答案的答案。

1 个答案:

答案 0 :(得分:2)

所以终于解决了! 找到一篇好的帖子herethis one,我就一起工作了。

简而言之,我必须做的事情:

  1. 删除我的构建器链接 - EF本身会创建链接(自己的关联表)
  2. 一点修改模型
  3. 创建 DatabaseInitializer
  4. 在方法Application.Start()的Global.asax中添加 Database.SetInitializer(new DatabaseInitializer()); 声明
  5. 不要忘记选择 ConnectionString DBcontext
  6. 通常在视图中使用
  7. 构造函数中的

    修改(不确定是否绝对必要,也许它与native / default构造函数完全相同):

    public class Article
    {
        public int ArticleID { get; set; }
        public string Title { get; set; }
        public DateTime Date { get; set; }
        public string Anotation { get; set; }
        public string Body { get; set; }
        public string SourceLink { get; set; }
        public virtual List<ArticleTag> ArticleTags { get; set; }
    
        public Article()
        {
            ArticleTags = new List<ArticleTag>();
        }
    }
    
    public class ArticleTag
    {
        public int ArticleTagID { get; set; }
        public string TagName { get; set; }
        public virtual List<Article> Articles { get; set; }
    
        public ArticleTag()
        {
            Articles = new List<Article>();
        }
    }
    

    DatabaseInitializer

    public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
    {
        protected override void Seed(DatabaseContext context)
        {
            ArticleTag tag1= new ArticleTag { TagName = "aaaa" };
            ArticleTag tag2= new ArticleTag { TagName = "bbbb" };
            ArticleTag tag3= new ArticleTag { TagName = "cccc" };
            var articleTags = new List<ArticleTag> { tag1, tag2, tag3};
            articleTags.ForEach(i => context.ArticleTags.Add(i));
            context.SaveChanges();
    
    
            Article a1 = new Article
            {
                Title = "Title1",
                Date = DateTime.Now,
                Anotation = "Anotation1",
                Body = "article_1",
                ArticleTags = new List<ArticleTag> { tag1 }
            };
            Article a2 = new Article
            {
                Title = "Title12",
                Date = DateTime.Now,
                Anotation = "Anotation2",
                Body = "article_2",
                ArticleTags = new List<ArticleTag> { tag2, tag3 }
            };
            var articles = new List<Article> { a1, a2 };
            articles.ForEach(a => context.Articles.Add(a));
            context.SaveChanges();
        }
    }