EF7 ne sauvegarde pas le graphe d'objet

entity-framework-core

Question

Je pense que je vais me sentir idiot de trouver la réponse à cette question, mais je ne peux tout simplement pas comprendre pourquoi EF7 n'enregistre pas le graphe d'objets de la même manière que je suis habitué à le faire en EF6.

Mon contexte est:

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; }
}

J'écris ensuite le code suivant:

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;
}

Après SaveChanges appelé SaveChanges l'objet de blog a un BlogId mais celui de BlogId dans les deux objets Post est toujours -1 et rien n'est ajouté à la base de données.

Réponse acceptée

À partir de EF 7 beta 6, l'appel de DbSet<T>.Add(obj) ajoute uniquement obj , mais pas toutes les entités associées à obj .

Dans votre cas, vous devez également appeler db.Posts.Add(post) pour chaque nouvelle publication.

Ce comportement changera probablement avant EF 7 RTM. Vous pouvez suivre les modifications apportées à cette API en observant ce problème sur GitHub: décision du comportement Add () avec les graphiques # 2726



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi