1

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

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 中的工作原理 - 链接两个模型,链接两个特定实例,...,以及如何全部编码。

谢谢任何答案。

4

1 回答 1

2

所以终于解决了!在这里找到了一个好帖子,并与这个一起工作。

简而言之,我必须做的:

  1. 删除我的构建器链接- EF 本身创建链接(自己的关联表)
  2. 稍微修改模型
  3. 创建DatabaseInitializer
  4. 在 Global.asax 到方法 Application_Start() 添加Database.SetInitializer(new DatabaseInitializer()); 宣言
  5. 不要忘记设置ConnectionStringDBcontext
  6. 通常在视图中使用

构造函数中的修改(不确定是否绝对必要,也许它与本机/默认构造函数做同样的事情):

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();
    }
}
于 2013-06-06T14:10:07.340 回答