using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Kreta.Framework;
using Kreta.Framework.Collections;
using Kreta.Framework.Collections.Generic;
using Kreta.Framework.Entities;
using Kreta.Framework.Entities.Associations;
using Kreta.Framework.Entities.Generic;

namespace SDA.Kreta.Entities
{
    internal sealed class FileDBHelper : EntityDBHelper<File>
    {
        private Dictionary<string, string> dynamicColumns = new Dictionary<string, string>()
        {
            { "Extension", "T_FILE_OSSZES.C_EXTENSION" },
            { "FeltoltesDatum", "T_FILE_OSSZES.C_FELTOLTESDATUM" },
            { "FileGuid", "T_FILE_OSSZES.C_FILEGUID" },
            { "FileNev", "T_FILE_OSSZES.C_FILENEV" },
            { "FileSizeByte", "T_FILE_OSSZES.C_FILESIZEBYTE" },
            { "IntezmenyGuid", "T_FILE_OSSZES.C_INTEZMENYGUID" },
            { "Utvonal", "T_FILE_OSSZES.C_UTVONAL" },
            { "VeglegesitesDatum", "T_FILE_OSSZES.C_VEGLEGESITESDATUM" },
            { "Megjegyzes", "T_FILE_OSSZES.C_MEGJEGYZES" },
        };

        private const string dynamicQueryCommandText =
            "select " +
                "T_FILE_OSSZES.ID, " +
                "{COLUMNS}" +
                // File betöltése
                // File kapcsoló mezői
                "T_FILE_OSSZES.C_FELHASZNALOID, " + /* Kötelező asszociációs kapcsolómező */
                "T_FILE_OSSZES.C_INTEZMENYID, " + /* Kötelező asszociációs kapcsolómező */
                "T_FILE_OSSZES.C_TANEVID, " + /* Kötelező asszociációs kapcsolómező */
                "T_FILE_OSSZES.TOROLT, " +
                "T_FILE_OSSZES.SERIAL, " +
                "T_FILE_OSSZES.CREATED, " +
                "T_FILE_OSSZES.CREATOR, " +
                "T_FILE_OSSZES.LASTCHANGED, " +
                "T_FILE_OSSZES.MODIFIER " +
            "from " +
                "T_FILE_OSSZES " +
            "where " +
                "(1 = 1) ";

        private const string emptyQueryCommandText =
            "select " +
                "T_FILE_OSSZES.ID, " +
                // File betöltése
                // File mezői
                "T_FILE_OSSZES.C_EXTENSION, " +
                "T_FILE_OSSZES.C_FELTOLTESDATUM, " +
                "T_FILE_OSSZES.C_FILEGUID, " +
                "T_FILE_OSSZES.C_FILENEV, " +
                "T_FILE_OSSZES.C_FILESIZEBYTE, " +
                "T_FILE_OSSZES.C_INTEZMENYGUID, " +
                "T_FILE_OSSZES.C_UTVONAL, " +
                "T_FILE_OSSZES.C_VEGLEGESITESDATUM, " +
                "T_FILE_OSSZES.C_MEGJEGYZES, " +
                // File kapcsoló mezői
                "T_FILE_OSSZES.C_FELHASZNALOID, " + /* Kötelező asszociációs kapcsolómező */
                "T_FILE_OSSZES.C_INTEZMENYID, " + /* Kötelező asszociációs kapcsolómező */
                "T_FILE_OSSZES.C_TANEVID, " + /* Kötelező asszociációs kapcsolómező */
                "T_FILE_OSSZES.TOROLT, " +
                "T_FILE_OSSZES.SERIAL, " +
                "T_FILE_OSSZES.CREATED, " +
                "T_FILE_OSSZES.CREATOR, " +
                "T_FILE_OSSZES.LASTCHANGED, " +
                "T_FILE_OSSZES.MODIFIER " +
            "from " +
                "T_FILE_OSSZES " +
            "where " +
                "(1 = 1) ";

        public override string EmptyQueryCommandText
        {
            get
            {
                return emptyQueryCommandText;
            }
        }

        public override string DynamicQueryCommandText
        {
            get
            {
                return dynamicQueryCommandText;
            }
        }

        public override IDictionary<string, string> DynamicColumns
        {
            get
            {
                return dynamicColumns;
            }
        }

        protected override File CreateEntityInstance()
        {
            return File.GiveAnInstance();
        }

        #region Lekérdezés

        public override void LoadEntityFields(File entity, SDA.DataProvider.SDADataReader reader)
        {
            // File betöltése
            // File mezői

            entity.m_Extension = DAUtil.ReadStringAttribute(reader, 1);


            entity.m_FeltoltesDatum = DAUtil.ReadDateTimeAttribute(reader, 2, DateTime.Now);


            entity.m_FileGuid = DAUtil.ReadGuidAttribute(reader, 3);


            entity.m_FileNev = DAUtil.ReadStringAttribute(reader, 4);


            entity.m_FileSizeByte = DAUtil.ReadIntegerAttribute(reader, 5);


            entity.m_IntezmenyGuid = DAUtil.ReadGuidAttribute(reader, 6, default(Guid));


            entity.m_Utvonal = DAUtil.ReadStringAttribute(reader, 7);


            entity.m_VeglegesitesDatum = DAUtil.ReadDateTimeAttribute(reader, 8);


            entity.m_Megjegyzes = DAUtil.ReadStringAttribute(reader, 9);

            // File kapcsoló mezői
            DAUtil.ReadIDAttribute(reader, 10, ref entity.m_FelhasznaloId, 0);
            DAUtil.ReadIDAttribute(reader, 11, ref entity.m_IntezmenyId, 0);
            DAUtil.ReadIDAttribute(reader, 12, ref entity.m_TanevId, 0);
        }

        public override void LoadEntityFields(File entity, SDA.DataProvider.SDADataReader reader, ColumnFilterMode columnFilterMode, IEnumerable<string> columns)
        {
            int index = 1;
            if (columns == null)
            {
                columns = new List<string>(index);
            }
            // File betöltése
            // File mezői
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("Extension"))))
            {
                entity.m_Extension = DAUtil.ReadStringAttribute(reader, index++);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("FeltoltesDatum"))))
            {
                entity.m_FeltoltesDatum = DAUtil.ReadDateTimeAttribute(reader, index++, DateTime.Now);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("FileGuid"))))
            {
                entity.m_FileGuid = DAUtil.ReadGuidAttribute(reader, index++);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("FileNev"))))
            {
                entity.m_FileNev = DAUtil.ReadStringAttribute(reader, index++);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("FileSizeByte"))))
            {
                entity.m_FileSizeByte = DAUtil.ReadIntegerAttribute(reader, index++);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("IntezmenyGuid"))))
            {
                entity.m_IntezmenyGuid = DAUtil.ReadGuidAttribute(reader, index++, default(Guid));
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("Utvonal"))))
            {
                entity.m_Utvonal = DAUtil.ReadStringAttribute(reader, index++);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("VeglegesitesDatum"))))
            {
                entity.m_VeglegesitesDatum = DAUtil.ReadDateTimeAttribute(reader, index++);
            }
            if (((columnFilterMode == ColumnFilterMode.DEFAULT_ALLOWED) ^ (columns.Contains("Megjegyzes"))))
            {
                entity.m_Megjegyzes = DAUtil.ReadStringAttribute(reader, index++);
            }
            // File kapcsoló mezői
            DAUtil.ReadIDAttribute(reader, index++, ref entity.m_FelhasznaloId, 0);
            DAUtil.ReadIDAttribute(reader, index++, ref entity.m_IntezmenyId, 0);
            DAUtil.ReadIDAttribute(reader, index++, ref entity.m_TanevId, 0);
        }

        #endregion

        #region Paraméter kötés

        public override void BindAttributes(File entity, SDA.DataProvider.SDACommand command)
        {
            DAUtil.BindParameter(command, "pEXTENSION", SDA.DataProvider.SDADBType.String, 50, entity.m_Extension, entity.m_Extension == null);

            DAUtil.BindParameter(command, "pFELTOLTESDATUM", SDA.DataProvider.SDADBType.DateTime, entity.m_FeltoltesDatum, false);

            DAUtil.BindParameter(command, "pFILEGUID", SDA.DataProvider.SDADBType.Guid, entity.m_FileGuid, entity.m_FileGuid == null);

            DAUtil.BindParameter(command, "pFILENEV", SDA.DataProvider.SDADBType.String, 1000, entity.m_FileNev, entity.m_FileNev == null);

            DAUtil.BindParameter(command, "pFILESIZEBYTE", SDA.DataProvider.SDADBType.Int, entity.m_FileSizeByte, entity.m_FileSizeByte == null);

            DAUtil.BindParameter(command, "pINTEZMENYGUID", SDA.DataProvider.SDADBType.Guid, entity.m_IntezmenyGuid, false);

            DAUtil.BindParameter(command, "pUTVONAL", SDA.DataProvider.SDADBType.String, 2000, entity.m_Utvonal, entity.m_Utvonal == null);

            DAUtil.BindParameter(command, "pVEGLEGESITESDATUM", SDA.DataProvider.SDADBType.DateTime, entity.m_VeglegesitesDatum, entity.m_VeglegesitesDatum == null);

            DAUtil.BindParameter(command, "pMEGJEGYZES", SDA.DataProvider.SDADBType.String, 1000, entity.m_Megjegyzes, entity.m_Megjegyzes == null);
        }

        public override void DynamicBindAttributes(File entity, SDA.DataProvider.SDACommand command)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            if (entity.HasChanged("Extension"))
            {
                sb.Append("C_EXTENSION = :pEXTENSION,");

                DAUtil.BindParameter(command, "pEXTENSION", SDA.DataProvider.SDADBType.String, 50, entity.m_Extension, entity.m_Extension == null);

            }
            if (entity.HasChanged("FeltoltesDatum"))
            {
                sb.Append("C_FELTOLTESDATUM = :pFELTOLTESDATUM,");

                DAUtil.BindParameter(command, "pFELTOLTESDATUM", SDA.DataProvider.SDADBType.DateTime, entity.m_FeltoltesDatum, false);

            }
            if (entity.HasChanged("FileGuid"))
            {
                sb.Append("C_FILEGUID = :pFILEGUID,");

                DAUtil.BindParameter(command, "pFILEGUID", SDA.DataProvider.SDADBType.Guid, entity.m_FileGuid, entity.m_FileGuid == null);

            }
            if (entity.HasChanged("FileNev"))
            {
                sb.Append("C_FILENEV = :pFILENEV,");

                DAUtil.BindParameter(command, "pFILENEV", SDA.DataProvider.SDADBType.String, 1000, entity.m_FileNev, entity.m_FileNev == null);

            }
            if (entity.HasChanged("FileSizeByte"))
            {
                sb.Append("C_FILESIZEBYTE = :pFILESIZEBYTE,");

                DAUtil.BindParameter(command, "pFILESIZEBYTE", SDA.DataProvider.SDADBType.Int, entity.m_FileSizeByte, entity.m_FileSizeByte == null);

            }
            if (entity.HasChanged("IntezmenyGuid"))
            {
                sb.Append("C_INTEZMENYGUID = :pINTEZMENYGUID,");

                DAUtil.BindParameter(command, "pINTEZMENYGUID", SDA.DataProvider.SDADBType.Guid, entity.m_IntezmenyGuid, false);

            }
            if (entity.HasChanged("Utvonal"))
            {
                sb.Append("C_UTVONAL = :pUTVONAL,");

                DAUtil.BindParameter(command, "pUTVONAL", SDA.DataProvider.SDADBType.String, 2000, entity.m_Utvonal, entity.m_Utvonal == null);

            }
            if (entity.HasChanged("VeglegesitesDatum"))
            {
                sb.Append("C_VEGLEGESITESDATUM = :pVEGLEGESITESDATUM,");

                DAUtil.BindParameter(command, "pVEGLEGESITESDATUM", SDA.DataProvider.SDADBType.DateTime, entity.m_VeglegesitesDatum, entity.m_VeglegesitesDatum == null);

            }
            if (entity.HasChanged("Megjegyzes"))
            {
                sb.Append("C_MEGJEGYZES = :pMEGJEGYZES,");

                DAUtil.BindParameter(command, "pMEGJEGYZES", SDA.DataProvider.SDADBType.String, 1000, entity.m_Megjegyzes, entity.m_Megjegyzes == null);

            }
            command.CommandText = command.CommandText.Replace("{COLUMNS}", sb.ToString());
        }

        public override void BindAssociations(File entity, SDA.DataProvider.SDACommand command)
        {
            DAUtil.BindIdParameter(command, "pFELHASZNALOID", entity.InternalFelhasznaloId);
            DAUtil.BindIdParameter(command, "pINTEZMENYID", entity.InternalIntezmenyId);
            DAUtil.BindIdParameter(command, "pTANEVID", entity.InternalTanevId);
        }

        #endregion
    }

    internal class FileDA : EntityDataAccessor<File>
    {
        private static FileDBHelper m_dbhelper = new FileDBHelper();

        protected override IEntityDBHelper<File> dbhelper
        {
            get { return m_dbhelper; }
        }

        #region Load

        public override bool LoadEntity(File entity, int entityId)
        {
            return LoadById(entity, entityId);
        }

        public override bool FilteredLoadEntity(File entity, int entityId, ColumnFilterMode columnFilterMode, IEnumerable<string> columns)
        {
            return LoadById(entity, entityId, columnFilterMode, columns);
        }

        public bool LoadById(File entity, int entityId)
        {
            using (SDA.DataProvider.SDACommand command = dbhelper.CreateEmptyQueryCommand())
            {
                command.CommandText += " and (T_FILE_OSSZES.ID = :pID) ";
                command.Parameters.Add("pID", SDA.DataProvider.SDADBType.Int).Value = entityId;
                return dbhelper.LoadSingleEntity(entity, command);
            }
        }

        public bool LoadById(File entity, int entityId, ColumnFilterMode columnFilterMode, IEnumerable<string> columns)
        {
            using (SDA.DataProvider.SDACommand command = dbhelper.CreateDynamicQueryCommand(columnFilterMode, columns))
            {
                command.CommandText += " and (T_FILE_OSSZES.ID = :pID) ";
                command.Parameters.Add("pID", SDA.DataProvider.SDADBType.Int).Value = entityId;
                return dbhelper.LoadSingleEntity(entity, command, columnFilterMode, columns);
            }
        }

        [Obsolete("Ezt ne használjátok, mert mindenhova bele kellene fogalmazni a tanév szűrést is! Meg fog majd szűnni!")]
        public override void LoadWithFilter(IEntityCollection<File> collection, string filter, Dictionary<string, object> commandParameters = null)
        {
            using (SDA.DataProvider.SDACommand command = dbhelper.CreateEmptyQueryCommand())
            {
                command.CommandText += filter;
                dbhelper.CreateParameterBinding(command, commandParameters);
                dbhelper.LoadEntityCollection(collection, command);
            }
        }

        [Obsolete("Ezt ne használjátok, mert mindenhova bele kellene fogalmazni a tanév szűrést is! Meg fog majd szűnni!")]
        public override void LoadWithFilter(IEntityCollection<File> collection, string filter, ColumnFilterMode columnFilterMode, IEnumerable<string> columns, Dictionary<string, object> commandParameters = null)
        {
            using (SDA.DataProvider.SDACommand command = dbhelper.CreateDynamicQueryCommand(columnFilterMode, columns))
            {
                command.CommandText += filter;
                dbhelper.CreateParameterBinding(command, commandParameters);
                dbhelper.LoadEntityCollection(collection, command, columnFilterMode, columns);
            }
        }

        #endregion

        #region InsertEntity

        private const string m_InsertCommandText = @"
        insert into T_FILE_OSSZES (
            C_EXTENSION,
            C_FELTOLTESDATUM,
            C_FILEGUID,
            C_FILENEV,
            C_FILESIZEBYTE,
            C_INTEZMENYGUID,
            C_UTVONAL,
            C_VEGLEGESITESDATUM,
            C_MEGJEGYZES,
            C_FELHASZNALOID,
            C_INTEZMENYID,
            C_TANEVID,
            TOROLT,
            SERIAL,
            CREATED,
            CREATOR)
        values (
            :pEXTENSION,
            :pFELTOLTESDATUM,
            :pFILEGUID,
            :pFILENEV,
            :pFILESIZEBYTE,
            :pINTEZMENYGUID,
            :pUTVONAL,
            :pVEGLEGESITESDATUM,
            :pMEGJEGYZES,
            :pFELHASZNALOID,
            :pINTEZMENYID,
            :pTANEVID,
            :pTOROLT,
            :pSERIAL,
            :pCREATED,
            :pCREATOR);

        SELECT SCOPE_IDENTITY() as ID;

        ";

        public override void InsertEntity(File entity)
        {
            entity.Serial = 0;
            SetEntityCreator(entity, DateTime.Now, UserContext.Instance.UniqueIdentifier);

            using (SDA.DataProvider.SDACommand command = DAUtil.CreateCommand(m_InsertCommandText))
            {
                dbhelper.BindAttributes(entity, command);
                dbhelper.BindAssociations(entity, command);
                command.Parameters.Add("pTOROLT", SDA.DataProvider.SDADBType.Boolean /* Boolean */).Value = false;
                command.Parameters.Add("pSERIAL", SDA.DataProvider.SDADBType.Int).Value = 0;
                command.Parameters.Add("pCREATED", SDA.DataProvider.SDADBType.DateTime).Value = entity.EntityCreated;
                command.Parameters.Add("pCREATOR", SDA.DataProvider.SDADBType.Int).Value = entity.EntityCreator;
                entity.ID = Convert.ToInt32(command.ExecuteScalar());

            }
        }

        #endregion

        #region UpdateEntity

        private const string m_UpdateAttributesCommandText = @"
        update T_FILE_OSSZES
        set
          {COLUMNS}
          SERIAL = ISNULL(SERIAL,0) + 1,
          LASTCHANGED = :pLASTCHANGED,
          MODIFIER = :pMODIFIER,
          TOROLT = :pTOROLT
        where
          (ID = :pID) and (ISNULL(SERIAL,0) = :pSERIAL)
        ";

        public override bool UpdateEntity(File entity)
        {
            using (SDA.DataProvider.SDACommand command = DAUtil.CreateCommand(m_UpdateAttributesCommandText))
            {
                bool result = true;
                dbhelper.DynamicBindAttributes(entity, command);

                SetEntityModifier(entity, DateTime.Now, UserContext.Instance.UniqueIdentifier);

                command.Parameters.Add("pID", SDA.DataProvider.SDADBType.Int).Value = entity.ID;
                command.Parameters.Add("pSERIAL", SDA.DataProvider.SDADBType.Int).Value = entity.Serial;
                command.Parameters.Add("pLASTCHANGED", SDA.DataProvider.SDADBType.DateTime).Value = entity.EntityLastChanged;
                command.Parameters.Add("pMODIFIER", SDA.DataProvider.SDADBType.Int).Value = entity.EntityModifier;
                command.Parameters.Add("pTOROLT", SDA.DataProvider.SDADBType.Boolean /* Boolean */).Value = entity.Torolt;

                result = (command.ExecuteNonQuery() == 1);
                if (result == true)
                    entity.Serial++;

                return result;
            }
        }

        #endregion

        #region DeleteEntity

        private const string m_FizikaiDeleteCommandText = @"DELETE FROM T_FILE_OSSZES WHERE (ID = :pID) ";
        private const string m_LogikaiDeleteCommandText = @"
        UPDATE T_FILE_OSSZES 
        SET TOROLT = 'T' ,
          SERIAL = SERIAL + 1,
          LASTCHANGED = :pLASTCHANGED,
          MODIFIER = :pMODIFIER
        WHERE (ID = :pID) ";

        public override void DeleteEntity(File entity, bool logikai = true)
        {
            var _deleteCommandText = logikai ? m_LogikaiDeleteCommandText : m_FizikaiDeleteCommandText;
            using (SDA.DataProvider.SDACommand command = DAUtil.CreateCommand(_deleteCommandText))
            {
                command.Parameters.Add("pID", SDA.DataProvider.SDADBType.Int).Value = entity.ID;

                if (logikai)
                {
                    DateTime lastchanged = DateTime.Now;
                    var modifier = UserContext.Instance.UniqueIdentifier;

                    command.Parameters.Add("pLASTCHANGED", SDA.DataProvider.SDADBType.DateTime).Value = lastchanged;
                    command.Parameters.Add("pMODIFIER", SDA.DataProvider.SDADBType.Int).Value = modifier;
                }

                if (command.ExecuteNonQuery() != 1)
                {
                    throw new EntityNotFoundException("File", entity.ID);
                }
            }

        }

        #endregion

        #region UpdateAssociations

        private const string m_UpdateAssociationCommandText = @"
        update T_FILE_OSSZES
        set
            C_FELHASZNALOID = :pFELHASZNALOID,
            C_INTEZMENYID = :pINTEZMENYID,
            C_TANEVID = :pTANEVID,
            SERIAL = ISNULL(SERIAL,0) + 1,
            LASTCHANGED = :pLASTCHANGED,
            MODIFIER = :pMODIFIER
        where
          (ID = :pID) and (ISNULL(SERIAL,0) = :pSERIAL)
        ";

        public override bool UpdateAssociations(File entity)
        {
            using (SDA.DataProvider.SDACommand command = DAUtil.CreateCommand(m_UpdateAssociationCommandText))
            {
                dbhelper.BindAssociations(entity, command);

                DateTime lastchanged = DateTime.Now;
                var modifier = UserContext.Instance.UniqueIdentifier;

                command.Parameters.Add("pID", SDA.DataProvider.SDADBType.Int).Value = entity.ID;
                command.Parameters.Add("pSERIAL", SDA.DataProvider.SDADBType.Int).Value = entity.Serial;
                command.Parameters.Add("pLASTCHANGED", SDA.DataProvider.SDADBType.DateTime).Value = lastchanged;
                command.Parameters.Add("pMODIFIER", SDA.DataProvider.SDADBType.Int).Value = modifier;

                bool result = (command.ExecuteNonQuery() == 1);
                if (result == true)
                {
                    entity.Serial++;
                    SetEntityModifier(entity, lastchanged, modifier);
                }
                return result;
            }
        }

        #endregion

        #region Asszociációkkal kapcsolatos adatbázisműveletek (entitásspecifikus)

        #region Mint asszociációs osztály
        #endregion

        // kapcsolómező a másik táblában van, és nem önmagára mutat
        private const string m_LoadBySzirStatFileIdFilter = @" and (exists (select 1 from T_SZIRSTATFILE_OSSZES where C_FILEID = T_FILE_OSSZES.ID and T_SZIRSTATFILE_OSSZES.ID = :pID)) ";

        public bool LoadBySzirStatFileId(int id, File entity)
        {
            return dbhelper.LoadByPartnerId(entity, m_LoadBySzirStatFileIdFilter, id);
        }

        // kapcsolómező a másik táblában van, és nem önmagára mutat
        private const string m_LoadByProfilkepFileIdFilter = @" and (exists (select 1 from T_PROFILKEPFILE_OSSZES where C_FILEID = T_FILE_OSSZES.ID and T_PROFILKEPFILE_OSSZES.ID = :pID)) ";

        public bool LoadByProfilkepFileId(int id, File entity)
        {
            return dbhelper.LoadByPartnerId(entity, m_LoadByProfilkepFileIdFilter, id);
        }

        // kapcsolómező a másik táblában van, és nem önmagára mutat
        private const string m_LoadByIktatottDokumentumCsatolmanyIdFilter = @" and (exists (select 1 from T_IKTATOTTDOKUMENTUMCSATOLMANY_OSSZES where C_FILEID = T_FILE_OSSZES.ID and T_IKTATOTTDOKUMENTUMCSATOLMANY_OSSZES.ID = :pID)) ";

        public bool LoadByIktatottDokumentumCsatolmanyId(int id, File entity)
        {
            return dbhelper.LoadByPartnerId(entity, m_LoadByIktatottDokumentumCsatolmanyIdFilter, id);
        }

        // kapcsolómező a másik táblában van, és nem önmagára mutat
        private const string m_LoadByDualisSzerzodesFileIdFilter = @" and (exists (select 1 from T_DUALISSZERZODESFILE_OSSZES where C_FILEID = T_FILE_OSSZES.ID and T_DUALISSZERZODESFILE_OSSZES.ID = :pID)) ";

        public bool LoadByDualisSzerzodesFileId(int id, File entity)
        {
            return dbhelper.LoadByPartnerId(entity, m_LoadByDualisSzerzodesFileIdFilter, id);
        }

        // kapcsolómező a másik táblában van, és nem önmagára mutat
        private const string m_LoadByUjSzktSzakmajegyzekOsszerendelesIdFilter = @" and (exists (select 1 from T_UJSZKTSZAKMAJEGYZEKOSSZEREND_OSSZES where C_FILEID = T_FILE_OSSZES.ID and T_UJSZKTSZAKMAJEGYZEKOSSZEREND_OSSZES.ID = :pID)) ";

        public bool LoadByUjSzktSzakmajegyzekOsszerendelesId(int id, File entity)
        {
            return dbhelper.LoadByPartnerId(entity, m_LoadByUjSzktSzakmajegyzekOsszerendelesIdFilter, id);
        }


        #endregion
    }


    /// <summary>
    /// Az osztály elvégzi az UML modell 'Felhasznalo -> File (File)'
    /// asszociációjának teljes kezelését.
    /// </summary>
    internal class Felhasznalo_File_DA : EntityCollectionDA<Felhasznalo, File>
    {
        internal protected Felhasznalo_File_DA(Felhasznalo owner)
            : base(owner)
        {
        }

        // Nincs kapcsolótábla
        private const string m_Filter = @" and (T_FILE_OSSZES.C_FELHASZNALOID = :pID) ";

        public override void LoadCollection(IAssociatedEntityCollection<File> collection)
        {
            new FileDBHelper().LoadByPartnerId(collection, m_Filter, Owner.ID);
        }

        private static SDA.DataProvider.SDACommand CreateInsertFileCommand()
        {
            SDA.DataProvider.SDACommand result = new SDA.DataProvider.SDACommand();
            // nincs kapcsolótábla...
            result.CommandText = @"update T_FILE_OSSZES set C_FELHASZNALOID = :pFELHASZNALOID where (ID = :pFILEID)";
            result.Parameters.Add("pFELHASZNALOID", SDA.DataProvider.SDADBType.Int);
            result.Parameters.Add("pFILEID", SDA.DataProvider.SDADBType.Int);
            return result;
        }

        private void DoAdd(Felhasznalo owner, File partner)
        {
            using (SDA.DataProvider.SDACommand command = CreateInsertFileCommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.Parameters["pFELHASZNALOID"].Value = owner.ID;
                command.Parameters["pFILEID"].Value = partner.ID;
                command.ExecuteNonQuery();
            }
        }

        public override void AddItem(File entity)
        {
            var assochandler = AssociationHandlerManager.Create<File, Felhasznalo>("File_Felhasznalo");
            assochandler.BeforeInsert(entity, this.Owner);
            entity.ModifyFelhasznalo(this.Owner);
            if (entity.State == EntityState.Modified)
            {
                entity.UpdateAssociations(true);
            }
            else
            {
                entity.Insert(true);
            }
            assochandler.AfterInsert(entity, this.Owner);
        }

        private static SDA.DataProvider.SDACommand CreateDeleteFileCommand()
        {
            SDA.DataProvider.SDACommand result = new SDA.DataProvider.SDACommand();
            // nincs kapcsolótábla...
            result.CommandText = @"update T_FILE_OSSZES set C_FELHASZNALOID = null where (C_FELHASZNALOID = :pFELHASZNALOID and ID = :pFILEID)";
            result.Parameters.Add("pFELHASZNALOID", SDA.DataProvider.SDADBType.Int);
            result.Parameters.Add("pFILEID", SDA.DataProvider.SDADBType.Int);
            return result;
        }

        private void DoRemove(Felhasznalo owner, File partner)
        {
            using (SDA.DataProvider.SDACommand command = CreateDeleteFileCommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.Parameters["pFELHASZNALOID"].Value = owner.ID;
                command.Parameters["pFILEID"].Value = partner.ID;
                command.ExecuteNonQuery();
            }
        }

        public override void DeleteItem(File entity)
        {
            var assochandler = AssociationHandlerManager.Create<File, Felhasznalo>("File_Felhasznalo");
            assochandler.BeforeDelete(entity, this.Owner);
            entity.Delete(true);
            assochandler.AfterDelete(entity, this.Owner);
        }
    }

    /// <summary>
    /// Az osztály elvégzi az UML modell 'Intezmeny -> File (File)'
    /// asszociációjának teljes kezelését.
    /// </summary>
    internal class Intezmeny_File_DA : EntityCollectionDA<Intezmeny, File>
    {
        internal protected Intezmeny_File_DA(Intezmeny owner)
            : base(owner)
        {
        }

        // Nincs kapcsolótábla
        private const string m_Filter = @" and (T_FILE_OSSZES.C_INTEZMENYID = :pID) ";

        public override void LoadCollection(IAssociatedEntityCollection<File> collection)
        {
            new FileDBHelper().LoadByPartnerId(collection, m_Filter, Owner.ID);
        }

        private static SDA.DataProvider.SDACommand CreateInsertFileCommand()
        {
            SDA.DataProvider.SDACommand result = new SDA.DataProvider.SDACommand();
            // nincs kapcsolótábla...
            result.CommandText = @"update T_FILE_OSSZES set C_INTEZMENYID = :pINTEZMENYID where (ID = :pFILEID)";
            result.Parameters.Add("pINTEZMENYID", SDA.DataProvider.SDADBType.Int);
            result.Parameters.Add("pFILEID", SDA.DataProvider.SDADBType.Int);
            return result;
        }

        private void DoAdd(Intezmeny owner, File partner)
        {
            using (SDA.DataProvider.SDACommand command = CreateInsertFileCommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.Parameters["pINTEZMENYID"].Value = owner.ID;
                command.Parameters["pFILEID"].Value = partner.ID;
                command.ExecuteNonQuery();
            }
        }

        public override void AddItem(File entity)
        {
            var assochandler = AssociationHandlerManager.Create<File, Intezmeny>("File_Intezmeny");
            assochandler.BeforeInsert(entity, this.Owner);
            entity.ModifyIntezmeny(this.Owner);
            if (entity.State == EntityState.Modified)
            {
                entity.UpdateAssociations(true);
            }
            else
            {
                entity.Insert(true);
            }
            assochandler.AfterInsert(entity, this.Owner);
        }

        private static SDA.DataProvider.SDACommand CreateDeleteFileCommand()
        {
            SDA.DataProvider.SDACommand result = new SDA.DataProvider.SDACommand();
            // nincs kapcsolótábla...
            result.CommandText = @"update T_FILE_OSSZES set C_INTEZMENYID = null where (C_INTEZMENYID = :pINTEZMENYID and ID = :pFILEID)";
            result.Parameters.Add("pINTEZMENYID", SDA.DataProvider.SDADBType.Int);
            result.Parameters.Add("pFILEID", SDA.DataProvider.SDADBType.Int);
            return result;
        }

        private void DoRemove(Intezmeny owner, File partner)
        {
            using (SDA.DataProvider.SDACommand command = CreateDeleteFileCommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.Parameters["pINTEZMENYID"].Value = owner.ID;
                command.Parameters["pFILEID"].Value = partner.ID;
                command.ExecuteNonQuery();
            }
        }

        public override void DeleteItem(File entity)
        {
            var assochandler = AssociationHandlerManager.Create<File, Intezmeny>("File_Intezmeny");
            assochandler.BeforeDelete(entity, this.Owner);
            entity.Delete(true);
            assochandler.AfterDelete(entity, this.Owner);
        }
    }

    /// <summary>
    /// Az osztály elvégzi az UML modell 'Tanev -> File (File)'
    /// asszociációjának teljes kezelését.
    /// </summary>
    internal class Tanev_File_DA : EntityCollectionDA<Tanev, File>
    {
        internal protected Tanev_File_DA(Tanev owner)
            : base(owner)
        {
        }

        // Nincs kapcsolótábla
        private const string m_Filter = @" and (T_FILE_OSSZES.C_TANEVID = :pID) ";

        public override void LoadCollection(IAssociatedEntityCollection<File> collection)
        {
            new FileDBHelper().LoadByPartnerId(collection, m_Filter, Owner.ID);
        }

        private static SDA.DataProvider.SDACommand CreateInsertFileCommand()
        {
            SDA.DataProvider.SDACommand result = new SDA.DataProvider.SDACommand();
            // nincs kapcsolótábla...
            result.CommandText = @"update T_FILE_OSSZES set C_TANEVID = :pTANEVID where (ID = :pFILEID)";
            result.Parameters.Add("pTANEVID", SDA.DataProvider.SDADBType.Int);
            result.Parameters.Add("pFILEID", SDA.DataProvider.SDADBType.Int);
            return result;
        }

        private void DoAdd(Tanev owner, File partner)
        {
            using (SDA.DataProvider.SDACommand command = CreateInsertFileCommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.Parameters["pTANEVID"].Value = owner.ID;
                command.Parameters["pFILEID"].Value = partner.ID;
                command.ExecuteNonQuery();
            }
        }

        public override void AddItem(File entity)
        {
            var assochandler = AssociationHandlerManager.Create<File, Tanev>("File_Tanev");
            assochandler.BeforeInsert(entity, this.Owner);
            entity.ModifyTanev(this.Owner);
            if (entity.State == EntityState.Modified)
            {
                entity.UpdateAssociations(true);
            }
            else
            {
                entity.Insert(true);
            }
            assochandler.AfterInsert(entity, this.Owner);
        }

        private static SDA.DataProvider.SDACommand CreateDeleteFileCommand()
        {
            SDA.DataProvider.SDACommand result = new SDA.DataProvider.SDACommand();
            // nincs kapcsolótábla...
            result.CommandText = @"update T_FILE_OSSZES set C_TANEVID = null where (C_TANEVID = :pTANEVID and ID = :pFILEID)";
            result.Parameters.Add("pTANEVID", SDA.DataProvider.SDADBType.Int);
            result.Parameters.Add("pFILEID", SDA.DataProvider.SDADBType.Int);
            return result;
        }

        private void DoRemove(Tanev owner, File partner)
        {
            using (SDA.DataProvider.SDACommand command = CreateDeleteFileCommand())
            {
                command.Connection = UserContext.Instance.SDAConnection;
                command.Transaction = UserContext.Instance.SDATransaction;
                command.Parameters["pTANEVID"].Value = owner.ID;
                command.Parameters["pFILEID"].Value = partner.ID;
                command.ExecuteNonQuery();
            }
        }

        public override void DeleteItem(File entity)
        {
            var assochandler = AssociationHandlerManager.Create<File, Tanev>("File_Tanev");
            assochandler.BeforeDelete(entity, this.Owner);
            entity.Delete(true);
            assochandler.AfterDelete(entity, this.Owner);
        }
    }

}