Правило каскадного удаления в коде EF 4.1 сначала при использовании Ассоциации общего первичного ключа



Я реализовал двунаправленное отношение 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; }

    . . .
}

Где, студент является основной сущностью и анамнез это сущность, которая разделяет PK.

Теперь я хотел бы, чтобы созданная связь имела правило Delete = CASCADE. На самом деле, создаваемое отношение имеет правило Delete = NO ACTION, как показано ниже Изображение:

Введите описание изображения здесь

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

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

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

Примечание

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

134   2  

2 ответов:

Следующий fluent 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();
    }
}

Введите описание изображения здесь

Кроме того, вы можете использовать атрибут [Required], и он автоматически установит правило удаления в режим "каскад" в связанном отношении. (а также установить свойство "Allow Null" этой сущности в значение" false " в БД)

    Ничего не найдено.

Добавить ответ:
Отменить.