Nu kommer sista delen av vår entitymapper / ORMapper. Nämligen att kunna spara ner ett objekt till vår databas.
När det gäller spara delen så finns det ju 2 sätt, och det ena är att göra en INSERT och det andra är att göra en UPDATE. Ett ganska enkelt sätt att kolla vilket man skall göra är att kontrollera om vårt ID har ett värde, alltså om det finns ett värde i vårt IdentifierFält så gör vi en UPDATE och finns det inget värde så gör vi en INSERT. Det har sina nackdelar i bland, men i 99,5% av alla gånger så räcker en kontroll som denna kontroll.
Ett annat kanske lite smartare alternativ är att vi i vår Identifier-klass har chans att markera om vi vill göra en UPDATE eller INSERT med detta objekt. Vilket vi just har möjlighet till med vår Identifier-klass.
Vi börjar här med själva Save-metoden i vår EntityMapper
public ItemType Save<ItemType>(ItemType itemType)
{
//-- Declara variables
IDbCommand command = null;
DataTable dataTable = null;
try
{
//-- Create information objects
DataIdentifierInformation dataIdentifierInformation = CreateDataIdentifierInformation<ItemType>(itemType, null);
List<DataFieldInformation> dataFieldInformationList = CreateDataFieldInformation<ItemType>(itemType);
DataSourceInformation dataSourceInformation = CreateDataSourceInformation<ItemType>();
//-- Create and execute the command if this is an INSERT operation against storage.
if (dataIdentifierInformation.IdentifierSaveAction == IdentifierSaveActionEnum.Insert)
{
//-- Execute command
command = CreateInsertCommand(dataFieldInformationList, dataIdentifierInformation, dataSourceInformation);
//-- if the identifier is of the uniqueidentifier type, the identifier already has it's value set.
if (dataIdentifierInformation.IdentifierType == IdentifierTypeEnum.UniqueIdentifier)
YOUR_DAL.ExecuteNoResult(command);
//-- If the identifier is of the sequeenstype, we need to read that value from the databas and add it to the itemtype.
else
{
dataTable = YOUR_DAL.ExecuteDataTableResult(command);
if (dataTable != null && !string.IsNullOrEmpty(dataTable.Rows[0][0].ToString()))
SetIdentifier<ItemType>(itemType, new Identifier(dataTable.Rows[0][0].ToString()));
}
}
//-- Execute command if this is only an UPDATE operation angainst storage.
else
{
command = CreateUpdateCommand(dataFieldInformationList, dataIdentifierInformation, dataSourceInformation);
YOUR_DAL.ExecuteNoResult(command);
}
return itemType;
}
finally
{
if (dataTable != null)
dataTable.Dispose();
if (command != null)
command.Dispose();
}
}
Oj, det så väldigt komplicerat ut helt plötsligt. Men lugn det är det inte. Först så fyller vi våra Informations objekt precis som vi gjort tidigare. Sedan gör vi helt enkelt en kontroll på vår Identifier-objekt om detta objekt skall skall köras som en INSERT eller UPDATE.
Och när det gäller INSERTEN så har vi 2 alternativ, det ena är att vi har en GUID som identifier och då gör vi inget speciellt, det andra är att vi har en LONG/INT som identifier och då måste vi få tillbaka värdet från databasen till vårt objekt. Och det gör vi genom att när vi exekverara INSERT metoden så lägger vi på ett SELECT @@IDENTITY kommando också och hämtar tillbaka detta värde och sedan sätter vårt Identifierfield med detta värde.
- M

