usuwanie powiązanej relacji z EF

0

Witam,

Moja baza wygląda tak że zawiera talele "Classrooms" oraz "Subjects", przy czym każdy z Classrooms może zawierać kilka Subjects a więc klasa Classrooms wygląda następująco (połączona oczywiście relacja jeden do wielu poprzez dodatkową tabele w bazie SubjectsInClasrooms zawierającą powiązane ID jednego Classrooms oraz jednego Subjects):

public partial class Classrooms
    {
        public Classrooms()
        {
            this.Subjects1 = new HashSet<Subjects>();
        }
    
        public int Classroom_Id { get; set; }
        public string Name { get; set; }
        public string ShortName { get; set; }
        public int Capacity { get; set; }
    
        public virtual ICollection<Subjects> Subjects1 { get; set; }
    }

Teraz tak chciałbym stworzyć metodę która usunie jedno powiązane z SubjectsInClassrooms co próbowałem osiągnać tak lecz mi nie wychodzi:

public void DeleteSubjectFromClassroom(int Classroom_Id, int Subject_Id)
        {
            using (var db = this.context.CreateNew())
            {
                var obj = db.Classrooms
                    .FirstOrDefault(x => x.Classroom_Id == Classroom_Id).Subjects1
                    .Select(y => y.Subject_Id == Subject_Id);

                if (obj != null)
                {
                    db.Classrooms.
                    db.SaveChanges(obj);
                }
            }
        }

Jak to ugryźć?
Czy usuniecie powiązania z "ICollection<Subjects> Subjects1" nie spowoduje usunięcia elementu z tabeli Subject? (Chce usunąć jedynie powiązanie między nimi)

0

zalezy czy jest ustawione on cascade delete na tym polaczeniu.

jesli tak wtedy obiekt powiazany bedzie usuwany (obiekt Subject) , jesli nie ma to tylko zniknie relacja czyli fizycznie wpis z tabeli SubjectsInClassrooms.

0

no ok to już rozumiem,
jednak nie wiem czemu ale w miejscu wywołania metody remove otrzymuje błąd,
chciałem zwrócić element do usunięcia obiektu znajdującego się w liście Subject1,
próbowałem na rożne sposoby i już nie wiem jak to powinno wyglądać:

 Error	1	The best overloaded method match for 'System.Data.Entity.DbSet<zaplanuj.eu.Models.EF.Classrooms>.Remove(zaplanuj.eu.Models.EF.Classrooms)' has some invalid arguments	D:\Praca dyplomowa\zaplanuj.eu\zaplanuj.eu\Areas\Generator\Models\ClassroomService.cs	136	21	zaplanuj.eu

oraz

 Error	2	Argument 1: cannot convert from 'bool' to 'zaplanuj.eu.Models.EF.Classrooms'	D:\Praca dyplomowa\zaplanuj.eu\zaplanuj.eu\Areas\Generator\Models\ClassroomService.cs	136	42	zaplanuj.eu

p.s oczywiscie ta czesc w bloku if wyglada tak:

var obj = db.Classrooms
                    .FirstOrDefault(x => x.Classroom_Id == Classroom_Id).Subjects1
                    .Select(y => y.Subject_Id == Subject_Id).FirstOrDefault();
                
                if (obj != null)
                {
                    db.Classrooms.Remove(obj);
                    db.SaveChanges();
                } 
1

dlaczego uzywasz var zamiast poprawnej klasy?? wtedy od razu wiedzialbys ze obj jest klasy Subject a usuwasz go z Classrooms, ktore jest lista obiektow Classroom, p[oza tym to:

var obj = db.Classrooms
                    .FirstOrDefault(x => x.Classroom_Id == Classroom_Id).Subjects1
                    .Select(y => y.Subject_Id == Subject_Id).FirstOrDefault();

jak juz powinno wygaldac tak:

var obj = db.Classrooms.FirstOrDefault(x => x.Classroom_Id == Classroom_Id).Subjects1.FirstOrDefault(y => y.Subject_Id == Subject_Id)

a i tak wysypie ci sie jak nie bedzie classroomu o podanym id.

najpierw sprawdz czy masz dany classroom a potem usun z listy dany subject i zapisz context.

0

rozumiem ze var tez może być jedynie tylko troszkę przyćmiewa mi w przypadku gdy otrzymam błąd tak?
Co do cascade mam ustawione jedynie w przypadku gdy usunę jedna z tabel Classrooms bądź Subjects to usuwa się powiązanie miedzy nimi automatycznie właśnie przez cascade,
ale chyba to nie ma nic wspólnego z moim problemem rozumiem że powyższy kod usunie jedynie toi powiązanie?
Akurat nie mam teraz możliwości tego sprawdzić na bazie dlatego tak dopytuje.

Z góry dzięki za pomoc!

0

moze byc bo var lyknie wszystko, a tak jak obj bedzie obiektem danej klasy( a wtym przypadku inaczje nie bedzie) to visual studio od razu da ci info jesli bedziesz chcial go usunac z kolekcji innych obiektow. upraszczasz sobie zycie wtedy

0

Jednak dalej sypie sie błąd

 var obj = db.Classrooms.FirstOrDefault(x => x.Classroom_Id == Classroom_Id);

                if (obj != null)
                {
                    Subjects o = obj.Subjects1.FirstOrDefault(y => y.Subject_Id == Subject_Id);

                    if (o != null)
                    {
                        db.Classrooms.Remove(obj);
                        db.SaveChanges();
                    }
                }

1 użytkowników online, w tym zalogowanych: 0, gości: 1