Я использую EF Core 3.1 с SQL Сервером, и у меня есть приложение для опроса, в котором есть вопросы. Опрос имеет еще один или несколько вопросов. Каждый вопрос может иметь один или несколько вариантов. Это может распространяться на неограниченные уровни. например,
What is your Country?
|
|--France
|--United Kingdom
|--United States
|---What is your state?
|---New York
|---Alaska
|---California
|---What is your City?
|--- Los Angeles
|--- San Diego
|--- San Francisco
Мой код следующий:
public class Survey
{
public Survey()
{
Questions = new HashSet<Question>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public string Name { get; set; }
// A Survey may have one or more than one questions
public virtual ICollection<Question> Questions { get; set; }
}
public class Question
{
public Question()
{
Options = new HashSet<Option>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public string QuestionText { get; set; }
// A Survey may have one or more than one questions
public long? SurveyId { get; set; }
public virtual Survey Survey { get; set; }
// A Question may have one or more than one options
public virtual ICollection<Option> Options { get; set; }
// An Option may have one or more Questions
public long? ParentOptionId { get; set; }
public virtual Option ParentOption { get; set; }
}
public class Option
{
public Option()
{
SubQuestions = new HashSet<Question>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public string OptionText { get; set; }
// A Question may have one or more than one options
public long ParentQuestionid { get; set; }
public virtual Question ParentQuestion { get; set; }
// An Option may have one or more Questions
public virtual ICollection<Question> SubQuestions { get; set; }
}
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions options)
: base(options)
{
}
public virtual DbSet<Survey> Survey { get; set; }
public virtual DbSet<Question> Question { get; set; }
public virtual DbSet<Option> Option { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Survey>(entity =>
{
entity.HasMany(x => x.Questions)
.WithOne(x => x.Survey)
.IsRequired();
});
modelBuilder.Entity<Question>(entity =>
{
entity.HasMany(x => x.Options)
.WithOne(x => x.ParentQuestion)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity<Option>(entity =>
{
entity.HasMany(x => x.SubQuestions)
.WithOne(x => x.ParentOption)
.OnDelete(DeleteBehavior.Cascade);
});
}
}
Моя проблема здесь в том, что отношения между Вопросом и Вариантом (Вопрос имеет один или несколько вариантов, и этот вопрос может принадлежать один из вариантов) вызывает циклическую c ссылку. Как я могу разрешить ссылку cycli c в моем случае, которая вызывает проблемы с каскадами? Сначала я использую код, и я считаю, что мой домен logi c, который я описал в начале этого поста, является правильным. Я не вижу другого способа сделать это. Кто-нибудь может помочь?
Обновление № 1: Когда я запускаю Update-Database, я получаю:
Introducing FOREIGN KEY constraint 'FK_Question_Option_ParentOptionId' on table 'Question' 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.