Skip to content

Neue Entität erstellen

Entity-Definition

Für jedes Entity wird ein Interface vom Type IEntity erstellt. Wenn möglich sind Eigenschaften readonly zu definieren.

using Eis.Framework.Business.Base.Provider;

namespace Eis.MyDemo.Service.Demo;

internal class DemoProvider : ProviderBase, IDemoProvider
{
    protected override void InitializeImpl(IDictionary<string, string> parameters)
    {
        base.InitializeImpl(parameters);
    }
}

Implementierung

Die Implementierung wird mit dem Builder-Pattern umgesetzt. Um die Klassen in mehrere Files aufzuteilen wird eine Partial-Klasse erstellt.

DemoEntity.Impl.cs:

using Eis.Framework.Business.Base;

namespace Eis.MyDemo.Service.Demo.Impl;

public static partial class DemoEntity
{
    /// <summary>
    /// Konkrete Implementierung von <seealso cref="IDemoEntity"/>
    /// </summary>
    private class Impl : EntityBase<IDemoEntity>, IDemoEntity
    {
        /// <summary>
        /// NHibernate-Constructor
        /// </summary>
        // ReSharper disable once UnusedMember.Local
        // ReSharper disable once NotNullOrRequiredMemberIsNotInitialized
        private Impl()
        {
        }

        /// <summary>
        /// fachlicher Constructor
        /// </summary>
        /// <param name="id"></param>
        public Impl(string id)
        {
            Id = id;
        }

        public string Text { get; set; } = "";

    }
}

DemoEntity.Builder.cs:

namespace Eis.MyDemo.Service.Demo.Impl;

public static partial class DemoEntity
{
    /// <summary>
    /// Builder für <seealso cref="IDemoEntity"/>
    /// </summary>
    public class Builder
    {
        private readonly string _id = Guid.NewGuid().ToString();
        private string _text = "";


        internal static Builder Create()
            => new Builder();

        private Builder() { }

        public Builder WithText(string text)
        {
            _text = text;
            return this;
        }

        public IDemoEntity Build()
        {
            var demoEntity = new Impl(_id)
            {
                Text = _text
            };
            return demoEntity ;
        }
    }
}

DemoEntity.Updater.cs:

namespace Eis.MyDemo.Service.Demo.Impl;

public static partial class DemoEntity
{
    /// <summary>
    /// Gibt zurück, ob <seealso cref="Updater"/> für das übergebene Objekt verwendet werden kann.
    /// </summary>
    /// <param name="demoEntity">Demo-Entity</param>
    /// <returns></returns>
    public static bool CanAccess(IDemoEntity demoEntity)
        => demoEntity is Impl;

    public class Updater
    {
        private readonly Impl _demoEntity;

        public static Updater Update(IDemoEntity demoEntity) => new(demoEntity);

        private Updater(IDemoEntity demoEntity)
        {
            if (!CanAccess(demoEntity))
                throw new ArgumentException($@"Es wird ein von {nameof(Builder)} erstelltes Item erwartet.", nameof(demoEntity));

            _demoEntity = (Impl)demoEntity;
        }

        public Updater WithName(string text)
        {
            _demoEntity.Text = text;
            return this;
        }
    }
}

Für das NHIbernate-Mapping wird ein hbm-File erstellt. Wichtig: Embedded! DemoEntity_.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Eis.MyDemo.Service.Demo.Impl" assembly="Eis.MyDemo.Service.Demo">
    <class name="DemoEntity+Impl" table="DEMO_ENTITY" optimistic-lock="version" lazy="false" schema="business">
        <id name="Id">
            <column name="DEN_G_ID" not-null="true"/>
            <generator class="assigned"/>
        </id>

        <version name="Version" column="DEN_N_VERSION"/>

        <property name="PublicId" column= "DEN_S_ID_PUBLIC" type="AnsiString"/>
        <property name="ReferenceId" column= "DEN_S_ID_REFERENCE" type="AnsiString"/>
        <property name="LabelMode" column="DEN_S_LABEL_MODE" type="NHibernate.Type.EnumStringType`1[[Eis.Framework.Business.Core.LabelModes, Eis.Framework.Business.Core]], NHibernate"/>
        <property name="Label" column="DEN_S_LABEL" type="AnsiString"/>
        <property name="InsertedOn" column="DEN_D_INSERTED_ON"/>
        <property name="InsertedBy" column="DEN_S_INSERTED_BY" type="AnsiString"/>
        <property name="UpdatedOn" column="DEN_D_UPDATED_ON"/>
        <property name="UpdatedBy" column="DEN_S_UPDATED_BY" type="AnsiString"/>
        <property name="CreatedOn" column="DEN_D_CREATED_ON"/>
        <property name="CreatedBy" column="DEN_S_CREATED_BY" type="AnsiString"/>
        <property name="ModifiedOn" column="DEN_D_MODIFIED_ON"/>
        <property name="ModifiedBy" column="DEN_S_MODIFIED_BY" type="AnsiString"/>
        <property name="DeletedOn" column="DEN_D_DELETED_ON"/>
        <property name="DeletedBy" column="DEN_S_DELETED_BY" type="AnsiString"/>
        <property name="IsActive" column="DEN_N_IS_ACTIVE" type="Eis.Framework.Business.Base.Persistence.UserType.BooleanAsSmallInt, Eis.Framework.Business.Base"/>

        <property name="Text" column="DEN_S_TEXT" type="AnsiString"/>

    </class>
</hibernate-mapping>