2015-09-12 3 views
1

У меня есть 4 таблицы:EF Code First каскадное удаление не работает

табличные Пользователь

public enum SEX { Male, Female } 

public abstract class User 
{ 

    public int UserID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Phone { get; set; } 
    public SEX Sex { get; set; } 
} 

Доктор таблицы inherites от пользователя

[Table("Doctor")] 
public class Doctor : User 
{ 
    public string Department { get; set; } 
    public string Occupation { get; set; } 
    public string CabinetNumber { get; set; } 

    public virtual List<Treat> Treats { get; set; } 
} 

пациенте таблица inherites от пользователя

[Table("Patient")] 
public class Patient : User 
{ 
    public int InsuranceNumber { get; set; } 
    public int CardNumber { get; set; } 

    public virtual List<Treat> Treats { get; set; } 
} 

public class Treat 
{ 
    public int TreatId { get; set; } 

    public int DoctorUserId { get; set; } 
    public int PatientUserId { get; set; } 

    public virtual Doctor Doctor { get; set; } 
    public virtual Patient Patient { get; set; } 
} 

public class HospitalContext: DbContext 
    { 
     public HospitalContext() : base("DBConnectionString") { 
      Database.SetInitializer(new DropCreateDatabaseIfModelChanges<HospitalContext>()); 
     } 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Treat>() 
       .HasRequired(x => x.Doctor) 
       .WithMany(x => x.Treats) 
       .HasForeignKey(x => x.DoctorUserId) 
       .WillCascadeOnDelete(true); 

      modelBuilder.Entity<Treat>() 
       .HasRequired(x => x.Patient) 
       .WithMany(x => x.Treats) 
       .HasForeignKey(x => x.PatientUserId) 
       .WillCascadeOnDelete(true); 

      base.OnModelCreating(modelBuilder); 
     } 
     public DbSet<User> Users { get; set; } 
     public DbSet<Treat> Treats { get; set; } 
    } 

I hav Здесь вы найдете много ответов, но никто из них не работает. Я потратил несколько часов, пытаясь заставить его работать. Я знаю, что Entity Framework должен разрешать каскадное удаление, когда существует отношение «один ко многим», но оно не было

ответ

2

Entity Framework не применяет каскадное удаление с наследованием TPT (Table Per Type). Вы можете решить эту проблему с Code Кулак миграции:

CreateTable(
    "dbo.Treats", 
    c => new 
    { 
     TreatId = c.Int(nullable: false, identity: true), 
     DoctorUserId = c.Int(nullable: false), 
     PatientUserId = c.Int(nullable: false), 
    }) 
    .PrimaryKey(t => t.TreatId) 
    .ForeignKey("dbo.Doctor", t => t.DoctorUserId, cascadeDelete: true) 
    .ForeignKey("dbo.Patient", t => t.PatientUserId, cascadeDelete: true) 
    .Index(t => t.DoctorUserId) 
    .Index(t => t.PatientUserId); 

Важной частью является cascadeDelete: true. Вы должны вручную добавить его после генерации кода перехода. После этого в вашей базе данных вы получите каскадное удаление:

FOREIGN KEY ([DoctorUserId]) REFERENCES [dbo].[Doctor] ([UserID]) ON DELETE CASCADE, 
FOREIGN KEY ([PatientUserId]) REFERENCES [dbo].[Patient] ([UserID]) ON DELETE CASCADE 
+0

Благодарим за ответ. Это не работает. Я создал новый проект, чтобы протестировать другое время с нуля и создать пошаговую базу данных кода с миграцией, и все работает нормально, пока я не создал Inheritance User <- Doctor. Пользователь <- Пациент стратегии наследования TPT. В этой стратегии наследования это не работает. Но я попытался сделать это в стратегии TPC, и он отлично работает. –

+0

@Vorotnyak_Nazar Обновленный ответ. – ranquild

+0

Действительно? Вы знаете, почему это не работает? Так что базовый, и когда вы его используете, он не дает вам исключения! –

Смежные вопросы