在EF 6 Code First中保存一次列表



在著名的Blog/Post示例中,我们看到了Blog实体是如何保存的。

public class Blog 
{ 
     public int BlogId { get; set; } 
     public string Name { get; set; } 
     public virtual List<Post> Posts { get; set; } 
} 
public class Post 
{ 
     public int PostId { get; set; } 
     public string Title { get; set; } 
     public string Content { get; set; } 
     public int BlogId { get; set; } 
     public virtual Blog Blog { get; set; } 
}

保存博客很简单:

        var blog = new Blog { Name = name }; 
        db.Blogs.Add(blog); 
        db.SaveChanges(); 

但我不知道如何保存Post,因为它是一个列表。

我所做的是:

            foreach (var item in Posts)
            {
                Post p = new Post();
                p.Title = item.Title;
                p.Content = item.Content;
                SaveChanges();
            }

当然,这是可行的,但如果Posts包含许多项目,那么我们必须保存多次。它效率低下,我们怎么能只保存一次呢?

有两种方法可以做到这一点,要么添加到博客中。张贴并让实体框架自动设置外键:

Blog blog = new Blog 
{ 
    Name = name,
    Posts = new List<Post>()
}; 
foreach (var item in posts)
{
    Post p = new Post();
    p.Title = item.Title;
    p.Content = item.Content;
    blog.Posts.Add(p);
}
db.Blogs.Add(blog); 
db.SaveChanges(); 

或者直接添加到Posts表中:

// assuming you have a reference to the blog id in blogId
foreach (var item in posts)
{
    Post p = new Post();
    p.BlogId = blogId;
    p.Title = item.Title;
    p.Content = item.Content;
   db.Posts.Add(p);
}
db.SaveChanges();

您可以添加任意多的项目,但只需调用SaveChanges((一次,它只会访问数据库一次。

最新更新