Neue Entität erstellen
Entity-Definition
Für jedes Entity wird ein Interface vom Type IEntity
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>