Правило каскадного удаления в коде EF 4.1 сначала при использовании связи с общим первичным ключом - PullRequest
7 голосов
/ 29 апреля 2011

Я реализовал двунаправленное отношение 1: 1 на основе этого ответа:

Первичный / внешний ключ в Entity Framework

Я определяю двунаправленное отношение следующим образом:

public class Student
{   
    public virtual int StudentId { get; set; }
    public virtual Anamnesis Anamnesis { get; set; }

    . . .
}

public class Anamnesis
{
    [Key, ForeignKey("Student")]
    public int AnamnesisId { get; set; }

    public virtual Student Student { get; set; }

    . . .
}

где, Student - это основная сущность, а Anamnesis - это сущность, которая разделяет PK.

Теперь я хотел бы, чтобы у созданного отношения было правило удаления = CASCADE.На самом деле, создаваемая связь имеет Правило удаления = НЕТ ДЕЙСТВИЯ, как показано на следующем рисунке:

enter image description here

Если я вручную удаляю эту связь в окне Свойства таблицы и добавляю другиесвязи с правилом удаления = CASCADE, код работает так, как я ожидаю, позволяя мне удалить студента и его общий анамнез с тем же идентификатором.

Итак, вот мой вопрос:

Есть лиспособ использования аннотации данных (не Fluent API) в моем классе, чтобы я получил правило удаления Relation with CASCADE?Я предпочел бы использовать аннотацию данных, но если это невозможно, я был бы рад некоторому коду Fluent API, который делает эту работу.

NOTE

Я пробовалсвободный код API, который показан в этом сообщении .Это не работает в моем случае, когда у меня есть двунаправленные свойства.

Ответы [ 2 ]

10 голосов
/ 29 апреля 2011

Следующий свободный код API прекрасно включает каскадное удаление в базе данных:

public class Student
{   
    public virtual int StudentId { get; set; }
    public virtual Anamnesis Anamnesis { get; set; }
}

public class Anamnesis
{        
    public int AnamnesisId { get; set; }
    public virtual Student Student { get; set; }
}

public class Context : DbContext
{
    public DbSet<Student> Students { get; set; }
    public DbSet<Anamnesis> Anamnesises { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>()
                    .HasRequired(s => s.Anamnesis)
                    .WithRequiredPrincipal(a => a.Student)
                    .WillCascadeOnDelete();
    }
}

enter image description here

7 голосов
/ 17 февраля 2012

Кроме того, вы можете использовать [Обязательный] Атрибут, и он автоматически установит правило удаления в режим «CASCADE» в связанных отношениях. (а также установите для свойства «Разрешить пустое значение» этого объекта значение «ложь» в БД)

...