<commit_before>﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cg2.Orm;
using System.Diagnostics;
using Cg2.Orm.DataInterfaces;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using CodeProject.Data.Entity;

namespace Cg2.Data.Ef
{
    /// <summary>
    /// Data access voor adressen; zie IAdressenDao voor documentatie.
    /// </summary>
    public class AdressenDao: Dao<Adres>, IAdressenDao
    {
        /// <summary>
        /// Creeert nieuw adres, en bewaart gekoppelde
        /// persoonsadressen.
        /// </summary>
        /// <param name="adr">Te creeren adres</param>
        /// <returns>referentie naar gecreerde adres</returns>
        public override Adres Creeren(Adres adr)
        {
            return Bewaren(adr);
        }

        /// <summary>
        /// Bewaart adres en eventuele gekoppelde persoonsadressen.
        /// </summary>
        /// <param name="nieuweEntiteit">Te bewaren adres</param>
        /// <returns>referentie naar het bewaarde adres</returns>
        public override Adres Bewaren(Adres adr)
        {
            // Deze assertions moeten eigenlijk afgedwongen worden
            // door de businesslaag.  En eigenlijk moet deze method ook
            // werken zonder die asserties (en dan de juiste dingen
            // bijcreeren).
            // Voorlopig niet dus.

            Debug.Assert(adr.Straat != null);
            Debug.Assert(adr.Subgemeente != null);
            Debug.Assert(adr.Straat.ID != 0);
            Debug.Assert(adr.Subgemeente.ID != 0);

            using (ChiroGroepEntities db = new ChiroGroepEntities())
            {
                db.AttachObjectGraph(adr, dink=>dink.Straat.WithoutUpdate(), dink=>dink.Subgemeente.WithoutUpdate(), dink => dink.PersoonsAdres.First());
                db.SaveChanges();
            }
            return adr;
        }

        public Adres BewonersOphalen(int adresID, IList<int> gelieerdAan)
        {
            Adres resultaat = null;
            IList<PersoonsAdres> lijst = null;

            using (ChiroGroepEntities db = new ChiroGroepEntities())
            {
                db.PersoonsAdres.MergeOption = MergeOption.NoTracking;

                // NoTracking schakelt object tracking uit.  Op die manier
                // moet het resultaat niet gedetachet worden.  Detachen
                // deed blijkbaar de navigation properties verdwijnen.
                // (Voor entity framework moeten alle objecten in een
                // graaf ofwel aan dezelfde context hangen, ofwel aan
                // geen context hangen.  Het adres detachen, koppelt het<commit_msg>Alvorens een adres te posten, zorg ik ervoor dat de EntityKey zeker ok is.  Op die manier wordt een exception vermeden bij het attachen.<commit_after>﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cg2.Orm;
using System.Diagnostics;
using Cg2.Orm.DataInterfaces;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using CodeProject.Data.Entity;

namespace Cg2.Data.Ef
{
    /// <summary>
    /// Data access voor adressen; zie IAdressenDao voor documentatie.
    /// </summary>
    public class AdressenDao: Dao<Adres>, IAdressenDao
    {
        /// <summary>
        /// Creeert nieuw adres, en bewaart gekoppelde
        /// persoonsadressen.
        /// </summary>
        /// <param name="adr">Te creeren adres</param>
        /// <returns>referentie naar gecreerde adres</returns>
        public override Adres Creeren(Adres adr)
        {
            return Bewaren(adr);
        }

        /// <summary>
        /// Bewaart adres en eventuele gekoppelde persoonsadressen.
        /// </summary>
        /// <param name="nieuweEntiteit">Te bewaren adres</param>
        /// <returns>referentie naar het bewaarde adres</returns>
        public override Adres Bewaren(Adres adr)
        {
            // Deze assertions moeten eigenlijk afgedwongen worden
            // door de businesslaag.  En eigenlijk moet deze method ook
            // werken zonder die asserties (en dan de juiste dingen
            // bijcreeren).
            // Voorlopig niet dus.

            Debug.Assert(adr.Straat != null);
            Debug.Assert(adr.Subgemeente != null);
            Debug.Assert(adr.Straat.ID != 0);
            Debug.Assert(adr.Subgemeente.ID != 0);

            using (ChiroGroepEntities db = new ChiroGroepEntities())
            {
                // Als adr geen EntityKey-property heeft, dan krijg je in sommige
                // gevallen een exception bij AttachObjectGraph.
                //
                // Als een adres door de controller na een form post aan het 
                // model gebind wordt, heb je geen entity key.  Vandaar dat ik
                // er hier sowieso eentje creeer.

                adr.EntityKey = db.CreateEntityKey(typeof(Adres).Name, adr);

                db.AttachObjectGraph(adr, dink=>dink.Straat.WithoutUpdate(), dink=>dink.Subgemeente.WithoutUpdate(), dink => dink.PersoonsAdres.First());
                db.SaveChanges();
            }
            return adr;
        }

        public Adres BewonersOphalen(int adresID, IList<int> gelieerdAan)
        {
            Adres resultaat = null;
            IList<PersoonsAdres> lijst = null;

            using (ChiroGroepEntities db = new ChiroGroepEntities())
            {
                db.PersoonsAdres.MergeOption = MergeOption.NoTracking;

                // NoTracking schakelt object tracking uit.  Op die manier
                // moet het resultaat niet gedetachet worden.  Detachen
                // deed blijkbaar de navigation properties verdwijnen.
                // (Voor entity framework moeten alle objecten in een
                // graaf ofwel aan dezelfde context hangen, ofwel aan
                // geen context hangen.  Het adres detachen, koppelt het
{'fraction_non_alphanumeric': 0.09315300084530853, 'fraction_numerical': 0.0016906170752324597, 'mean_word_length': 1.9301634472511144, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 43, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '905260', 'n_tokens_mistral': 1778, 'n_tokens_neox': 1750, 'n_words': 460}