Правило каскадного удаления в коде 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-код, который показан в этом посте . Это не работает в моем случае, когда у меня есть двунаправленные свойства.

422   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 " в БД)

Comments

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