Могу ли я использовать аннотации данных для выполнения Cascade Delete с Entity Framework 4.1 RC?
При использовании аннотаций данных с 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;
Если не так, как это достигается?
Ответы
Ответ 1
Внесение требуемого значения в поле "Категория продукта" Поле отношения к категории разрешает этот
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
[Required] //<======= Forces Cascade delete
public Category Category { get; set; }
}
Ответ 2
Мне нравится отключать каскадное удаление по умолчанию (удалив OneToManyCascadeDeleteConvention
)
Тогда я надеялся добавить их обратно через аннотации, но был удивлен, что EF не включает CascadeDeleteAttribute
.
Проведя слишком длинную работу над EF смешными внутренними уровнями доступа, код в этом gist добавляет соглашение, которое позволяет использовать атрибуты: https://gist.github.com/tystol/20b07bd4e0043d43faff
Чтобы использовать, просто вставьте [CascadeDelete]
в любой конец свойств навигации для отношения и добавьте соглашение в свой обратный вызов DbContext OnModeCreating. например:
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
Не уверен в аннотации данных, но вы можете добавить его в базу данных, изменив фактическое отношение.
Похоже, что для аннотаций данных нет ответа:
http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/394821ae-ab28-4b3f-b554-184a6d1ba72d/
Этот вопрос показывает, как это сделать с помощью свободного синтаксиса, но не уверен, что это применимо к 4.1 RC
EF 4.1 RC: Weird Cascade Delete
Ответ 4
В качестве дополнительного примера для Tyson answer, я использую атрибут [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; }
}