2016-02-20 2 views
4

Вот мои модели:ASP.NET 5 (MVC6) EF7 внешний ключ может вызвать циклы

public class Post 
{ 

    [Key] 
    public int PostId { get; set; } 

    [Required] 
    [MaxLength(140)] 
    public string Title { get; set; } 

    [Required] 
    public string ApplicationUserId { get; set; } 

    public ApplicationUser ApplicationUser { get; set; } 
    public ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    [Key] 
    public int CommentId { get; set; } 

    [Required] 
    [StringLength(1000)] 
    public string Text { get; set; } 

    [Required] 
    public int PostId { get; set; } 

    [Required] 
    public string ApplicationUserId { get; set; } 


    public Post Post { get; set; } 
    public ApplicationUser ApplicationUser { get; set; } 

} 

Я получаю сообщение об ошибке:

Introducing FOREIGN KEY constraint 'FK_Comment_Post_PostId' on table 'Comment' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.

Это точно, как это показано в их documents.

Теперь, если я удалю:

[Required] 
public int PostId { get; set; } 

и использовать Fluent API следующим образом:

builder.Entity<Comment>().HasOne(p => p.Post).WithMany(c => c.Comments).IsRequired(); 

Я все еще получаю ту же ошибку. Если я в явном виде указываю

builder.Entity<Comment>().HasOne(p => p.Post).WithMany(c => c.Comments).IsRequired().OnDelete(DeleteBehavior.Cascade); 

Я по-прежнему получаю ту же ошибку.

Если я использую следующее:

builder.Entity<Comment>().HasOne(p => p.Post).WithMany(c => c.Comments); 

Комментарий может быть введен без Post. Комментарий должен принадлежать сообщению.

Я что-то упустил? Это общий прецедент, отношение 1 к многим с требуемым FK для ПК.

+0

Кроме того, обратите внимание, что ApplicationUser настроен таким же образом. Но эти столбцы настроены правильно. – DanielC

ответ

10

Я действительно что-то пропустил. Моя структура заключается в том, что Пользователь может иметь сообщение. Сообщение может иметь комментарии. Поскольку в комментарии также есть Пользователь, это и вызывает циклическую проблему.

Когда сообщение удалено, оно будет каскадом удалять Комментарий. Это то, что мы хотим.

Когда пользователь удаляется, он будет каскадировать удаление на сообщение и комментарий. Но Post также попытается выполнить каскад delete для комментария.

Решение, которое я использовал, состояло в удалении каскадного удаления с пользователя на комментарий.

Это делается следующим образом:

builder.Entity<Comment>().HasOne(c => c.ApplicationUser).WithMany(u => u.Comments).IsRequired().OnDelete(DeleteBehavior.Restrict); 
Смежные вопросы