ASP.. NET MVC多对多关系(维护插入顺序)

本文关键字:插入 维护 顺序 关系 NET MVC ASP | 更新日期: 2023-09-27 18:02:30

我在SQL中定义了两个表:"Inquerito"answers"Pergunta",以及第三个表"Inquerito_Pergunta"来创建多对多关系。在最后一个表中,主键既是Inquerito的主键,也是Pergunta的主键。

我应该在"Inquerito"实例中添加尽可能多的"Perguntas"。保持插入顺序是很重要的,所以当我把它展示给用户的时候它是按照同样的顺序展示的。一个"Pergunta"也可以有多个"Inquerito",但在这种情况下顺序无关紧要。

我使用MVC 4实体框架和我的模型是这样定义的:

    public partial class Inquerito
    {
      public Inquerito()
      {
          this.Pergunta = new List<Pergunta>();
      }
      public System.Guid id { get; set; }
      public virtual ICollection<Pergunta> Pergunta { get; set; }
    }

    public partial class Pergunta
    {
      public Pergunta()
      {
        this.Inquerito = new List<Inquerito>();
      }
      public System.Guid id { get; set; }
      public virtual ICollection<Inquerito> Inquerito { get; set; }
    }

正如您所看到的,我已经将默认的HashSet更改为List。

保存所有的东西到数据库,我这样做:

    inquerito.Pergunta.Add(pergunta);
    db.Pergunta.Add(pergunta);
    db.Inquerito.Add(inquerito);

问题是插入顺序丢失了。

添加完所有我想要的"Pergunta"后:

        // Grava alterações e desconecta da base de dados.
        db.SaveChanges();
        Inquerito inquerito1 = db.Inquerito.Find(inquerito.id);
        if (inquerito1 != null)
        {
            foreach (Pergunta p in inquerito1.Pergunta.ToList())
            {
                System.Diagnostics.Debug.WriteLine("__pergunta: " + p.descricao);
            }
        }
        db = new quest_geralEntities();
        inquerito1 = db.Inquerito.Find(inquerito.id);
        if (inquerito1 != null)
        {
            foreach (Pergunta p in inquerito1.Pergunta.ToList())
            {
                System.Diagnostics.Debug.WriteLine("__pergunta: " + p.descricao);
            }
        }

所以,当我第一次打印所有链接到"Inquerito"的"Pergunta"时,一切都以正确的顺序(插入顺序)显示,但是当我更新上下文时,使用:"new quest_geralEntities()"当我再次打印它时,插入顺序完全丢失了。

这个问题我已经纠结了好几个小时了,但我找不到解决办法。我希望我说得够清楚,能帮到你。

谢谢。

ASP.. NET MVC多对多关系(维护插入顺序)

如果您想要保持插入顺序,我建议使用包含递增的int类型的字段。您可以添加一个int标识列,但它不是主键,并使用该列进行排序,以保持插入顺序。

您可以尝试更改关系的属性类型:

public virtual IList<Inquerito> Inquerito { get; set; }
public virtual IList<Pergunta> Pergunta { get; set; }

您需要重新生成数据库模式。我不确定它是否在EF上工作,但在NHibernate中,它可以工作。