2015-08-25 18 views
0

我想我會覺得自己像一個白癡,當我找出答案,但我不明白爲什麼EF7不像我習慣的那樣保存對象圖在EF6工作。EF7沒有保存對象圖

我的背景是:

public class BloggingContext : DbContext, IBloggingContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     // Make Blog.Url required 
     modelBuilder.Entity<Blog>() 
      .Property(b => b.Url) 
      .Required(); 

     modelBuilder.Entity<Post>() 
      .Reference(p => p.Blog) 
      .InverseCollection(b => b.Posts) 
      .ForeignKey(p => p.BlogId); 
    } 
} 

public class Blog 
{ 
    private ICollection<Post> _posts; 

    public int BlogId { get; set; } 
    public string Url { get; set; } 

    public virtual ICollection<Post> Posts 
    { 
     get 
     { 
      if (_posts == null) 
      { _posts = new Collection<Post>(); } 
      return _posts; 
     } 
     protected set 
     { _posts = value; } 

    } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 

    public Blog Blog { get; set; } 
} 

然後我寫了下面的代碼:

using (var db = new BloggingContext()) 
{ 
    var blog = new Blog() { Url = DateTime.Now.ToString() }; 
    blog.Posts.Add(new Post() { Title = "Foo", Content = "Foo" }); 
    blog.Posts.Add(new Post() { Title = "Bar", Content = "Bar" }); 

    db.Blogs.Add(blog); 
    var count = db.SaveChanges(); 

    Console.WriteLine("{0} records saved to database", count); 

    return blog.BlogId; 
} 

SaveChanges之後被稱爲blog對象有一個BlogId,但在這兩個Post對象BlogId仍然是 - 1並沒有任何東西被添加到數據庫中。

回答

1

從EF 7 beta 6開始,調用DbSet<T>.Add(obj)僅添加obj,而不是與obj關聯的所有實體。

對於您的情況,您還需要爲每個新帖子調用db.Posts.Add(post)

此行爲在EF 7 RTM之前可能會發生變化。您可以通過在GitHub上觀看此問題來更改此API:Decide on Add() behavior with graphs #2726