Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

.NET 4.x Автоматическое удаление данных из таблицы EntityFramework

В EntityFramework есть две сущности:
public class Book { public int Id { get; set; } public string Name { get; set; } public ICollection Chapters { get; set; } }
public class Chapter { public int Id { get; set; } public string Name { get; set; } public string Period { get; set; } }
При добавлении в коллекцию Chapters объектов Chapter они автоматически добавляются в соответствующую таблицу в БД. При удалении в записях удаляется только ссылка на Book
Как сделать так, чтобы при удалении объектов из Chapters записи о них удалялись из соответствующей таблицы в БД?


Ответ

Добавьте BookId и Book в Chapter
public class Chapter { public int Id { get; set; } public string Name { get; set; } public string Period { get; set; }
public int BookId { get; set; }
public virtual Book Book { get; set; } }
и сделайте его частью ключа:
modelBuilder.Entity().Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); modelBuilder.Entity().HasKey(c => new { c.Id, c.BookId });
тогда при занулении Chapters или при вызове Chapters.Remove соответствующие Chapters будут удалены.
Полный пример:
public class Model1 : DbContext { public Model1() : base("name=Model1") { }
public virtual DbSet Books { get; set; } public virtual DbSet Chapters { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); modelBuilder.Entity().HasKey(c => new { c.Id, c.BookId });
base.OnModelCreating(modelBuilder); } }
public class Book { public int Id { get; set; } public string Name { get; set; } public ICollection Chapters { get; set; } }
public class Chapter { public int Id { get; set; } public string Name { get; set; } public string Period { get; set; }
public int BookId { get; set; } public virtual Book Book { get; set; } }
class Program { static void Main(string[] args) { using (var context = new Model1()) { var book = new Book { Chapters = new List { new Chapter() } }; context.Books.Add(book); context.SaveChanges();
book.Chapters.Add(new Chapter()); book.Chapters.Add(new Chapter());
context.SaveChanges(); }
using (var context = new Model1()) { var book = context.Books.Include("Chapters").First();
book.Chapters.Add(new Chapter()); book.Chapters.Add(new Chapter());
context.SaveChanges(); } using (var context = new Model1()) { Console.WriteLine(context.Books.Count()); // 1 Console.WriteLine(context.Chapters.Count()); // 5 }
using (var context = new Model1()) { var b = context.Books.Include("Chapters").First(); b.Chapters = null;
context.SaveChanges(); }
using (var context = new Model1()) { Console.WriteLine(context.Books.Count()); // 1 Console.WriteLine(context.Chapters.Count()); // 0 } } }

Комментариев нет:

Отправить комментарий