linq много ко многим, как очистить таблицу "join"? - PullRequest
0 голосов
/ 18 марта 2019

Вот мой класс Formation:

namespace CVtheque.Entities
{
    public class Formation
    {

        public Formation()
        {
            this.CVs = new HashSet<CV>();
        }

        public int Id { get; set; }
        public string name { get; set; }

        public virtual ICollection<CV> CVs { get; set; }

    }
}

Вот мой класс CV

namespace CVtheque.Entities
{
    public class CV
    {
        public CV()
        {
            this.Formations = new HashSet<Formation>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Formation> Formations { get; set; }

        [InverseProperty("CVs")]
        public Personne Personne { get; set; }

    }
}

Я создал DBContext из этих двух классов, и таблица "join" FormationsCVs была создана автоматически.

На веб-странице пользователь может включить или отключить некоторые формации для каждого резюме.Как очистить таблицу FormationCVs с синтаксисом linq в контроллере, пожалуйста?А как вставить новые пары?(CV1Id, Formation1Id), (CV1Id, Formation2Id) и т. Д.

Ответы [ 3 ]

0 голосов
/ 19 марта 2019

Если вы используете Entity Framework, то достаточно удалить все элементы в коллекции.

Надлежащая структура «многие ко многим» в структуре сущностей определяется двумя способами:

class Formation
{
    public int Id {get; set;}
    ... // other columns

    // Every Formation has zero or more CVs (many-to-many)
    public virtual ICollection<CV> CVs {get; set;}
}
class CV
{
    public int Id {get; set;}
    ... // other columns

    // Every CV is for zero or more Formations (many-to-many)
    public virtual ICollection<Formation> Formations {get; set;}
}

Для вашего требования важно, чтобы virtual ICollections были определены с обеих сторон.

Если заданы идентификационный номер и cvId, удалите связь между формацией и CV с этими идентификаторами, не удаляя ни формацию, ни CV

var formationToClean = dbContext.Formations.Find(formationId);
var cvToClean = dbContext.CVs.Find(cvId);
// Consider fetching these items in one query.
// However, for this you will have to join three tables
// I'm not sure whether that will be faster then this Find that can use an index

formationToUpdate.CVs.Remove(cvToUpdate);
dbContext.SaveChanges();
0 голосов
/ 19 марта 2019

спасибо за ваши ответы.Я попытаюсь, но до этого я очень близок к решению с этим кодом:

// many to many add or delete


using (Context context = new Context())
                {

                    var existingCV = (from c in context.CVs
                                      where c.Id == cv.Id select c).FirstOrDefault();

                    if(formationsIds != null)
                    {
                         var clientSideFormations = context.Formations
                        .Where(t => formationsIds.Contains(t.Id));

                        var deletedFormations = existingCV.Formations.Except(clientSideFormations).ToList<Formation>();

                        var addedFormations = clientSideFormations.Except(existingCV.Formations).ToList<Formation>();

                        deletedFormations.ForEach(c => existingCV.Formations.Remove(c));

                            foreach (Formation f in addedFormations)
                    {
                        existingCV.Formations.Add(f);
                    }

                    }

formssIds - это набор идентификаторов образований из формы (связка).Это формации, которые я хочу, чтобы мое резюме имело.

Оно отлично работает, когда существующиеCV.Formation.Count () = 0, но я получаю ошибку 500, когда существующиеCV.Formation.Count ()> 0. В другихсловами, когда в моем резюме уже есть данные в базе данных, код выдает ошибку 500 в строке var addedFormations = ...

Как решить эту проблему, пожалуйста?

0 голосов
/ 18 марта 2019

Если вы хотите удалить:

            db.FormationCVs.Attach(obj); 
            db.FormationCVs.DeleteObject(obj);
            db.SaveChanges();

Если вы хотите добавить:

            db.FormationCVs.Add(obj)
            db.SaveChanges();
...