c# – EF7(Core)中同一个表的多个关系

前端之家收集整理的这篇文章主要介绍了c# – EF7(Core)中同一个表的多个关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这样的模特
  1. public class Question
  2. {
  3. public string Id { get; set; } = Guid.NewGuid().ToString();
  4.  
  5. public Answer Answer { get; set; }
  6. public List<Variant> Variants { get; set; }
  7.  
  8. public string CorrectVariantId { get; set; }
  9. public Variant CorrectVariant { get; set; }
  10. }
  11.  
  12. public class Variant
  13. {
  14. public string Id { get; set; } = Guid.NewGuid().ToString();
  15.  
  16. public string QuestionId { get; set; }
  17. public Question Question { get; set; }
  18. }
  19.  
  20. // mapping
  21.  
  22. modelBuilder.Entity<Question>()
  23. .HasOne(q => q.CorrectVariant)
  24. .WithOne(v => v.Question)
  25. .HasForeignKey<Question>(q => q.CorrectVariantId);
  26.  
  27. modelBuilder.Entity<Variant>()
  28. .HasOne(v => v.Question)
  29. .WithMany(a => a.Variants)
  30. .OnDelete(DeleteBehavior.Cascade);

在从EF RC1升级到RTM之前,这种方法非常有效.但现在它抛出:
System.InvalidOperationException:无法在’Question.Variants’和’Variant.Question’之间创建关系,因为’Question.CorrectVariant’和’Variant.Question’之间已经存在关系.导航属性只能参与单个关系.

如果没有从Question模型中删除Variants属性,是否有解决此问题的方法

@H_502_10@解决方法
这是RC1中的一个错误/不受欢迎的行为,它已得到修复.

你应该创建另一个属性,比如说另一个关系的SecondQuestion.

  1. public class Question
  2. {
  3. public string Id { get; set; } = Guid.NewGuid().ToString();
  4. public List<Variant> Variants { get; set; }
  5.  
  6. public string CorrectVariantId { get; set; }
  7. public Variant CorrectVariant { get; set; }
  8. }
  9.  
  10. public class Variant
  11. {
  12. public string Id { get; set; } = Guid.NewGuid().ToString();
  13.  
  14. public string QuestionId { get; set; }
  15. public Question Question { get; set; }
  16.  
  17. public Question SecondQuestion { get; set; }
  18. }

你的DbContext:

  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Entity<Question>()
  4. .HasOne(q => q.CorrectVariant)
  5. .WithOne(v => v.SecondQuestion)
  6. .HasForeignKey<Question>(q => q.CorrectVariantId);
  7.  
  8. modelBuilder.Entity<Variant>()
  9. .HasOne(v => v.Question)
  10. .WithMany(a => a.Variants).HasForeignKey(x => x.QuestionId).OnDelete(DeleteBehavior.SetNull);
  11.  
  12. base.OnModelCreating(modelBuilder);
  13. }

如何使用它:

  1. using (var myDb = new MyDbContext())
  2. {
  3. var variantFirst = new Variant();
  4. var variantSecond = new Variant();
  5.  
  6. var question = new Question();
  7. variantFirst.Question = question;
  8.  
  9. variantSecond.SecondQuestion = question;
  10.  
  11. myDb.Variants.Add(variantFirst);
  12. myDb.Variants.Add(variantSecond);
  13.  
  14. myDb.SaveChanges();
  15. }

猜你在找的C#相关文章