Можно ли использовать аннотации данных для каскадного удаления с помощью 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;
Если нет, то как это достигается?
4 ответов
размещение required в поле отношения категорий таблицы продуктов решает эту проблему
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
[Required] //<======= Forces Cascade delete
public Category Category { get; set; }
}
мне нравится отключать каскадное удаление по умолчанию (удаляя OneToManyCascadeDeleteConvention
)
Я тогда надеялся добавить их обратно через аннотации, но был удивлен, что EF не включает CascadeDeleteAttribute
.
потратив слишком много времени на работу вокруг смехотворных внутренних уровней доступа EF, код в этом gist добавляет соглашение, которое позволяет использовать атрибуты: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; }
}
Не уверен в аннотациях данных, но вы можете добавить его в базу данных, изменив фактическую связь.
похоже, что ответ нет для аннотаций данных: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/394821ae-ab28-4b3f-b554-184a6d1ba72d/
этот вопрос, похоже, показывает, как это сделать с помощью синтаксиса fluent, но не уверен, что это относится к 4.1 RC EF 4.1 RC: странный Каскад удалить
в качестве дополнительного примера для Тайсон, Я использую [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; }
}