首页 > 解决方案 > 将数据添加到一个表中会将重复数据添加到关系表中

问题描述

我必须有关系的表。表discipline列出了可能的学科。表participant列出了比赛的参与者。如果我添加参与者,它会将所选学科再次添加到discipline表中。

模型类discipline

public class Discipline
{
    public Discipline()
    {
        Participants = new HashSet<Participant>();
    }

    [Key]
    public int DisciplineId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Participant> Participants { get; set; }
}

模型类participant

public class Participant
{
    public Participant()
    {
        Disciplines = new HashSet<Discipline>();
    }

    [Key]
    public int ParticipantId { get; set; }
    public string Forename { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Discipline> Disciplines { get; set; }
    public virtual ICollection<Result> Results { get; set; }
}

这是将学科表的条目列表绑定到多选框的方法。

private void BindData()
{
        using (var db = new ParticipantsContext())
        {
            var disciplines = db.Disciplines.ToList();
            DisciplinListBox.ItemsSource = disciplines;
            DisciplinListBox.DataContext = disciplines;
        }
}

private void OK_Button_Click(object sender, RoutedEventArgs e)
{
        using (var db = new ParticipantsContext())
        {
            var selectedDisciplines = DisciplinListBox.SelectedItems;
            ICollection<Discipline> selectedDisciplinesCollection = new List<Discipline>();

            foreach (Discipline selectedDiscipline in selectedDisciplines)
            {
                Discipline discipline = new Discipline
                {
                    DisciplineId = selectedDiscipline.DisciplineId,
                    Name = selectedDiscipline.Name
                };
                selectedDisciplinesCollection.Add(discipline);
            }

            var participant = new Participant
            {
                Forename = ForenameTextBox.Text,
                Name = NameTextBox.Text,
                Disciplines = selectedDisciplinesCollection
            };

            db.Participants.Add(participant);
            db.SaveChanges();
        }

        this.Close();
}

我希望在表中添加 a和participant之间的关系- 但不添加新的.disciplineparticipantdbo.ParticipantDisciplinesdiscipline

我错过了什么?

如果需要完整代码:https ://gitlab.com/svanschu/EasyCalc/tree/master/DecksummeWPF

标签: c#.netentity-framework

解决方案


您正在创建 EF 无法跟踪的新对象。您可以像下面这样在事先保存时附加它们。

...
db.Disciplines.Attach(discipline); 
selectedDisciplinsCollection.Add(discipline);

推荐阅读