EF Entry не заботится о удаленных элементах?

Вы не могли итерировать или хранить больше данных, чем длина вашего массива. В этом случае вы можете сделать так:

for (int i = 0; i <= name.length - 1; i++) {
    // ....
}

Или это:

for (int i = 0; i < name.length; i++) {
    // ...
}
0
задан markzzz 13 July 2018 в 14:24
поделиться

1 ответ

Если вы хотите удалить все объекты, не входящие в коллекцию, вам нужно найти значения ключей для строк, которые вы хотите удалить. Вот пример:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ef6Test
{
    public class Blog
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Post> Posts { get; set; }
    }

    public class Post
    {
        public int Id { get; set; }
        public string Content { get; set; }
        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }

    public class BlogDbContext : DbContext
    {
        public BlogDbContext() : base("BlogDbContext") { }
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }
    }


    class DbInitializer : DropCreateDatabaseAlways<BlogDbContext>
    {
        protected override void Seed(BlogDbContext context)
        {
            base.Seed(context);
            for (int i = 0; i < 100; i++)
            {
                var b = new Blog() { Name = $"Blog {i}" };
                for (int j = 0; j < 10; j++)
                {
                    var p = new Post() { Blog = b, Content = $"Content {i} {j}" };
                    context.Posts.Add(p);
                }
                context.Blogs.Add(b);
                context.SaveChanges();
            }

        }
    }
    class Program
    {


        static void Main(string[] args)
        {
            Database.SetInitializer(new DbInitializer());

            //get an untracked Blog with its Posts
            Blog blog;
            using (var db = new BlogDbContext())
            {
                blog = db.Blogs.Include(b => b.Posts).AsNoTracking().First();

            }

            //remmove some posts
            int i = 0;
            foreach (var p in blog.Posts.ToList())
            {
                i++;
                if (i%2 == 0)
                {
                    blog.Posts.Remove(p);
                }
            }


            //delete the posts that have been removed
            using (var db = new BlogDbContext())
            {
                var postIdsToKeep = blog.Posts.Select(p => p.Id);
                var postIdsToDelete = from p in db.Posts.AsNoTracking()
                                    where p.BlogId == blog.Id
                                    where !postIdsToKeep.Contains(p.Id)
                                    select p.Id;

                //construct key-only entities for the Posts to be deleted
                foreach (var pid in postIdsToDelete)
                {
                    var p = new Post() { Id = pid };
                    db.Entry(p).State = EntityState.Deleted;
                }

                db.Database.Log = m => Console.WriteLine(m);
                db.SaveChanges();
            }
            Console.ReadKey();

        }
    }
}
1
ответ дан David Browne - Microsoft 17 August 2018 в 12:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: