Могу ли я использовать аннотации данных для выполнения каскадного удаления с Entity Framework 4.1 RC? - PullRequest
35 голосов
/ 06 апреля 2011

При использовании аннотаций данных с EF4.1 RC существует ли аннотация, вызывающая каскадное удаление?

public class Category
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public ICollection<Product> Products { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Category Category { get; set; }
}

При использовании этой модели генерируется ограничение:

ALTER TABLE [Product] ADD CONSTRAINT [Product_Category] 
FOREIGN KEY ([Category_Id]) REFERENCES [Categorys]([Id]) 
ON DELETE NO ACTION ON UPDATE NO ACTION;

Если не какэто достигнуто?

Ответы [ 4 ]

48 голосов
/ 06 апреля 2011

Внесение обязательных данных в таблицу Product. Поле отношения Категория решает эту проблему

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    [Required]  //<======= Forces Cascade delete
    public Category Category { get; set; }
}
40 голосов
/ 22 октября 2015

Мне нравится отключать каскадное удаление по умолчанию (удаляя OneToManyCascadeDeleteConvention)

Я тогда надеялся добавить их обратно через аннотации, но был удивлен, что EF не включает CascadeDeleteAttribute.

Потратив слишком много времени на работу над нелепыми внутренними уровнями доступа EF, код в этой сущности добавляет соглашение, позволяющее использовать атрибуты: https://gist.github.com/tystol/20b07bd4e0043d43faff

Для использования просто придерживайтесь[CascadeDelete] на обоих концах свойств навигации для отношения и добавьте соглашение в обратный вызов OnModeCreating вашего DbContext.Например:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    modelBuilder.Conventions.Add<CascadeDeleteAttributeConvention>();
}  

А в вашей модели:

public class BlogPost
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    [CascadeDelete]
    public List<BlogPostComment> Comments { get; set; } 
}
3 голосов
/ 06 апреля 2011

Не уверен в аннотациях данных, но вы можете добавить его в базу данных, изменив фактическое отношение.

Похоже, что ответ отрицательный для данных: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/394821ae-ab28-4b3f-b554-184a6d1ba72d/

Этот вопрос, кажется, показывает, как это сделать с использованием свободного синтаксиса, но не уверен, относится ли это к 4.1 RC EF 4.1 RC: странный каскад Удалить

1 голос
/ 30 ноября 2016

В качестве дополнительного примера к ответу Тайсона я использую атрибут [CascadeDelete], аналогичный приведенному ниже, в сущности, который успешно добавляет правило удаления "Каскад" в отношение Parent - Child.

public class Child
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    [SkipTracking]
    public Guid Id { get; set; }

    [CascadeDelete]
    public virtual Parent Parent { get; set; }

    [Required]
    [ForeignKey("Parent")]
    public Guid ParentId { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...