LLBLGen 3.1, .NET 4, PostgreSQL 9
Hello,
I wanna create DB independent application, so I have created custom IConcurrencyPredicateFactory
class OptimisticConcurrencyFactory : IConcurrencyPredicateFactory
{
public IPredicateExpression CreatePredicate(ConcurrencyPredicateType predicateTypeToCreate, object containingEntity)
{
IPredicateExpression toReturn = null;
if (predicateTypeToCreate == ConcurrencyPredicateType.Save)
{
toReturn = new PredicateExpression();
CommonEntityBase entity = (CommonEntityBase)containingEntity;
EntityField2 concurrencyField = (EntityField2)entity.Fields["ConcurrencyGuid"];
toReturn.Add(concurrencyField == concurrencyField.CurrentValue);
}
return toReturn;
}
}
and added in CommonEntityBase
protected override IConcurrencyPredicateFactory CreateConcurrencyPredicateFactory()
{
return new CareSense.ORMEntities.DatabaseGeneric.HelperClasses.OptimisticConcurrencyFactory();
}
I'm setting ConncurencyGuid field in Adapter before save
public override bool SaveEntity(IEntity2 entityToSave, bool refetchAfterSave, IPredicateExpression updateRestriction, bool recurse)
{
AddConcurrencyGuidToEntity(entityToSave, recurse);
return base.SaveEntity(entityToSave, refetchAfterSave, updateRestriction, recurse);
}
public override int SaveEntityCollection(IEntityCollection2 collectionToSave, bool refetchSavedEntitiesAfterSave, bool recurse)
{
foreach (IEntity2 entity in collectionToSave)
{
AddConcurrencyGuidToEntity(entity, recurse);
}
return base.SaveEntityCollection(collectionToSave, refetchSavedEntitiesAfterSave, recurse);
}
private void AddConcurrencyGuidToEntity(IEntity2 entityToSave, bool recurse)
{
if (recurse)
{
ObjectGraphUtils objectGraphUtils = new ObjectGraphUtils();
System.Collections.Generic.List<IEntity2> entityList = objectGraphUtils.ProduceTopologyOrderedList(entityToSave);
foreach (IEntity2 entity in entityList)
{
if (entity.IsDirty)
{
entity.Fields["ConcurrencyGuid"].CurrentValue = System.Guid.NewGuid().ToString();
}
}
}
else
{
if (entityToSave.IsDirty)
{
entityToSave.Fields["ConcurrencyGuid"].CurrentValue = System.Guid.NewGuid().ToString();
}
}
}
Everything is OK when I'm using SaveEntity method, but on SaveEntityCollecton ORMConcurrencyException is thrown every time.
Thanks in advance.