Click or drag to resize

BcfTransaction Constructor

Creates a new instance. It is recommended to use BcfDataSetBeginTransaction to create a transaction. The constructor should only be used in CreateTransaction(BcfTransactionBuilder).

Namespace:  CalculationWorks.BusinessModel
Assembly:  CalculationWorks.BusinessModel (in CalculationWorks.BusinessModel.dll) Version: 4.2.0
Syntax
protected BcfTransaction(
	BcfDataSet dataSet,
	BcfTransactionBuilder builder
)

Parameters

dataSet
Type: CalculationWorks.BusinessModelBcfDataSet
The dataset owning the new transaction.
builder
Type: CalculationWorks.BusinessModelBcfTransactionBuilder
The builder parameter.
Exceptions
ExceptionCondition
InvalidOperationExceptionDirectly constructor call. Use BcfDataSet.BeginTransaction() or BcfTransaction.BeginSubTransaction().
ArgumentNullExceptiondataSet or builder is .
Remarks
See example how to customize transactions.
Examples
Custom Transactions
using System;
using CalculationWorks.BusinessModel;
using CalculationWorks.BusinessModel.Design;
using CalculationWorks.BusinessModel.UndoRedo;

namespace MyNamespace
{
    public class MyTransactionBuilder : BcfTransactionBuilder
    {
        /// <summary>
        /// An additional comment
        /// </summary>
        public string Comment { get; set; }
    }
    public class MyTransactionInfo : IBcfTransactionInfo
    {
        /// <summary>
        /// The <see cref="IBcfTransactionInfo.Name"/> implementation.
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// The <see cref="MyTransactionBuilder.Comment">additional comment from builder</see>.
        /// </summary>
        public string Comment { get; set; }
        /// <summary>
        /// Date and time when transaction was committed.
        /// </summary>
        public DateTime? CommittedAt { get; set; }
    }
    public class MyTransaction : BcfTransaction
    {
        public MyTransaction([NotNull] BcfDataSet dataSet, [NotNull] BcfTransactionBuilder builder) : base(dataSet, builder)
        {
            // Info is not initialized for subtransactions
            if (IsSubTransaction) Info = DataSet.TransactionFactory.CreateTransactionInfoObject();
            Comment = ((MyTransactionBuilder)builder).Comment;
        }
        public MyTransactionInfo MyInfo {
            get { return (MyTransactionInfo)Info; }
        }
        /// <summary>
        /// The <see cref="MyTransactionBuilder.Comment">additional comment from builder</see>.
        /// </summary>
        public string Comment {
            get { return MyInfo.Comment; }
            set { MyInfo.Comment = value; }
        }
        /// <summary>
        /// Date and time when transaction was committed.
        /// </summary>
        public DateTime? CommittedAt {
            get { return MyInfo.CommittedAt; }
        }
        /// <summary>
        /// If using file-based undo here is the last chance for updates on <see cref="MyInfo"/> before it is serialized.
        /// </summary>
        protected override void OnBeforeCommitComplete()
        {
            MyInfo.CommittedAt = DateTime.Now;
        }
    }
    public class MyTransactionFactory : BcfTransactionFactoryBase<MyTransaction, MyTransactionInfo, MyTransactionBuilder>
    {
        public MyTransactionFactory([NotNull] BcfDataSet dataSet) : base(dataSet)
        {
            // changing default because it sucks
            EnforceConstraints = false;
        }
        public override MyTransaction CreateTransaction(BcfTransactionBuilder transactionBuilder)
        {
            return new MyTransaction(DataSet, transactionBuilder);
        }
    }
    // Handwritten part for BCF-Editor generated partial DataSetSetup-class.
    partial class MyDataSetSetup
    {
        // BCF-Editor generates "partial void Initialized();" we can implement in same cs-project the generated DataSetSetup-class resides.
        partial void Initialized()
        {
            CreateTransactionFactory = dataSet => new MyTransactionFactory(dataSet);
        }
    }
}
See Also