我希望当我找到答案时,我会觉得自己是个白痴,但是我无法弄清楚为什么EF7不能像我以前在EF6中使用它那样保存对象图。
我的上下文是:
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
,但BlogId
在这两个Post
对象仍然是-1,没有被添加到数据库中。
从EF 7 beta 6开始,调用DbSet<T>.Add(obj)
只会添加obj
,而不会添加与关联的所有实体obj
。
就您而言,您还需要致电db.Posts.Add(post)
每个新帖子。
在EF 7 RTM之前,这种行为可能会改变。您可以通过在GitHub上观看此问题来跟踪对此API的更改:使用图形#2726决定Add()的行为
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句