Export (0) Print
Expand All

IEntityWithChangeTracker Interface

Defines an entity type that implements change tracking.

Namespace:  System.Data.Objects.DataClasses
Assembly:  System.Data.Entity (in System.Data.Entity.dll)

public interface IEntityWithChangeTracker

An entity type must implement IEntityWithChangeTracker to track changes. EntityObject is the base class for all entity types that are generated by the Entity Data Model tools. EntityObject implements IEntityWithChangeTracker.

Object Services provides objects with a reference to an instance of the IEntityChangeTracker interface to enable objects to report changes. Methods on the IEntityChangeTracker are used to report changes.

To use custom data classes with an Entity Data Model (EDM), you must either inherit from EntityObject or implement a set of interfaces. When you implement custom data class interfaces, you must implement IEntityWithChangeTracker to track changes. For more information, see Reporting Changes in Custom Data Classes (Entity Framework).

This example shows the custom data classes Order and LineItem. These custom classes are mapped to the SalesOrderHeader and SalesOrderDetail tables in the AdventureWorks database. Both classes implement IEntityWithChangeTracker.

using System;
using System.Data.SqlTypes;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Objects.DataClasses;
using System.Data.Metadata.Edm;
using Microsoft.Samples.Edm;
//using Microsoft.Samples.Edm;

[assembly: EdmSchemaAttribute()]
[assembly: EdmRelationshipAttribute("Microsoft.Samples.Edm",
    "FK_LineItem_Order_OrderId", "Order",
    RelationshipMultiplicity.One, typeof(Order), "LineItem",
    RelationshipMultiplicity.Many, typeof(LineItem))]
namespace Microsoft.Samples.Edm
{   
    [EdmEntityTypeAttribute(NamespaceName = "Microsoft.Samples.Edm", Name = "Order")]
    public class Order : IEntityWithRelationships, IEntityWithChangeTracker, IEntityWithKey
    {
        // Define private property variables. 
        private int _orderId;
        private DateTime _orderDate;
        private DateTime _dueDate;
        private DateTime _shipDate;
        private byte _status;
        private int _customer;
        private decimal _subTotal;
        private decimal _tax;
        private decimal _freight;
        private decimal _totalDue;
        private OrderInfo _extendedInfo;

        #region ExplicitImplementation
        IEntityChangeTracker _changeTracker = null;

        // Specify the IEntityChangeTracker to use for tracking changes. 
        void IEntityWithChangeTracker.SetChangeTracker(IEntityChangeTracker changeTracker)
        {
            _changeTracker = changeTracker;

            // Every time the change tracker is set, we must also set all the  
            // complex type change trackers. 
            if (_extendedInfo != null)
            {
                _extendedInfo.SetComplexChangeTracker("ExtendedInfo", _changeTracker);
            }
        }

        EntityKey _entityKey = null;

        // Define the EntityKey property for the class.
        EntityKey IEntityWithKey.EntityKey
        {
            get 
            { 
                return _entityKey; 
            }
            set
            {
                // Set the EntityKey property, if it is not set. 
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging(StructuralObject.EntityKeyPropertyName);
                    _entityKey = value;
                    _changeTracker.EntityMemberChanged(StructuralObject.EntityKeyPropertyName);
                }
                else
                {
                    _entityKey = value;
                }
            }
        }

        RelationshipManager _relationships = null;

        // Define a relationship manager for the class.
        RelationshipManager IEntityWithRelationships.RelationshipManager
        {
            get
            {
                if (null == _relationships)
                    _relationships = RelationshipManager.Create(this);
                return _relationships;
            }
        }
        #endregion

        // Public properties of the Order object.
        [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
        public int OrderId
        {
            get 
            {
                return _orderId;
            }
            set
            {
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("OrderId");
                    _orderId = value;
                    _changeTracker.EntityMemberChanged("OrderId");
                }
                else
                {
                    _orderId = value;
                }
            }
        }

        // Navigation property that returns a collection of line items.
        [EdmRelationshipNavigationPropertyAttribute("Microsoft.Samples.Edm", "FK_LineItem_Order_OrderId", "LineItem")]
        public System.Data.Objects.DataClasses.EntityCollection<LineItem> LineItem
        {
            get
            {
                return ((IEntityWithRelationships)(this)).RelationshipManager.
                    GetRelatedCollection<LineItem>("FK_LineItem_Order_OrderId", "LineItem");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public DateTime OrderDate 
        {
           get 
            {
                return _orderDate;
            }
            set
            {
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("OrderDate");
                    _orderDate = value;
                    _changeTracker.EntityMemberChanged("OrderDate");
                }
                else
                {
                    _orderDate = value;
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public DateTime DueDate 
        {
            get 
            {
                return _dueDate;
            }
            set
            {
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("DueDate");
                    _dueDate = value;
                    _changeTracker.EntityMemberChanged("DueDate");
                }
                else
                {
                    _dueDate = value;
                }
            }
        }
        [EdmScalarPropertyAttribute()]
        public DateTime ShipDate
        {
            get
            {
                return _shipDate;
            }
            set
            {
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("ShipDate");
                    _shipDate = value;
                    _changeTracker.EntityMemberChanged("ShipDate");
                }
                else
                {
                    _shipDate = value;
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public byte Status
        {
            get 
            {
                return _status;
            }
            set
            {
                if (_status != value)
                {
                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging("Status");
                        _status = value;
                        _changeTracker.EntityMemberChanged("Status");
                    }
                    else
                    {
                        _status = value;
                    }
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int Customer
        {
            get
            {
                return _customer;
            }
            set
            {
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("Customer");
                    _customer = value;
                    _changeTracker.EntityMemberChanged("Customer");
                }
                else
                {
                    _customer = value;
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public decimal SubTotal
        {
            get
            {
                return _subTotal;
            }
            set 
            {
                if (_subTotal != value)
                {
                    // Validate the value before setting it. 
                    if (value < 0)
                    {
                        throw new ApplicationException(string.Format(
                                  Properties.Resources.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "SubTotal" }));
                    }
                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging("SubTotal");
                        _subTotal = value;
                        _changeTracker.EntityMemberChanged("SubTotal");
                    }
                    else
                    {
                        _subTotal = value;
                    }

                    // Recalculate the order total.
                    CalculateOrderTotal();
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public decimal TaxAmt
        {
            get
            {
                return _tax;
            }
            set
            {
                // Validate the value before setting it. 
                if (value < 0)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidNegative,
                              new string[2] { value.ToString(), "Tax" }));
                }
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("TaxAmt");
                    _tax = value;
                    _changeTracker.EntityMemberChanged("TaxAmt");
                }
                else
                {
                    _tax = value;
                }
                // Recalculate the order total.
                CalculateOrderTotal();
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public decimal Freight
        {
            get
            {
                return _freight;
            }
            set
            {
                if (_freight != value)
                {
                    // Validate the value before setting it. 
                    if (value < 0)
                    {
                        throw new ApplicationException(string.Format(
                                  Properties.Resources.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "Freight" }));
                    }

                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging("Freight");
                        _freight = value;
                        _changeTracker.EntityMemberChanging("Freight");
                    }
                    else
                    {
                        _freight = value;
                    }

                    // Recalculate the order total.
                    CalculateOrderTotal();
                }
            }
        }
        public decimal TotalDue
        {
            get
            {
                return _totalDue;
            }
        }
        [EdmComplexPropertyAttribute()]
        public OrderInfo ExtendedInfo
        {
            get
            {
                return _extendedInfo;
            }
            set
            {
                // For a complex type any changes in the complex type  
                // properties all get tracked together. 
                // The change tracker may be null during object materialization. 
                if (_changeTracker != null)
                {
                    // Since this is a complex property, we need to reset the change  
                    // tracker on the complex type.  
                    if (_extendedInfo != null)
                    {
                        // Reset the change tracker.
                        _extendedInfo.SetComplexChangeTracker("ExtendedInfo", null);
                    }

                    // Report the change.
                    _changeTracker.EntityMemberChanging("ExtendedInfo");
                    _extendedInfo = value;
                    _changeTracker.EntityMemberChanged("ExtendedInfo");
                }
                else
                {
                    _extendedInfo = value;
                }

                // Reset the change tracker. Complex type property cannot be null. 
                if (_extendedInfo != null)
                {
                    _extendedInfo.SetComplexChangeTracker("ExtendedInfo", _changeTracker);
                }
            }
        }
        private void CalculateOrderTotal()
        {
            // Update the total due as a sum of the other cost properties.
            _totalDue = _subTotal + _tax + _freight;
        }
}
    // Base class for complex types that implements change tracking. 
    public abstract class ComplexTypeChangeTracker
    {
        protected IEntityChangeTracker _complexChangeTracker = null;
        private string _rootComplexPropertyName;

        // Gets an IEntityChangeTracker to call for properties change.  
        // You must do this in order to track changes. 
        virtual public void SetComplexChangeTracker(string rootComplexPropertyName, IEntityChangeTracker complexChangeTracker)
        {
            _rootComplexPropertyName = rootComplexPropertyName;
            _complexChangeTracker = complexChangeTracker;
        }

        // Protected method that is called before the change for change tracking  
        // each of the scalar properties in the complex type. 
        protected void ReportMemberChanging(string scalarPropertyName)
        {
            if (null != _complexChangeTracker)
            {
                _complexChangeTracker.EntityComplexMemberChanging(_rootComplexPropertyName,
                                                           this, scalarPropertyName);
            }
        }

        // Protected method that is called after the change for change tracking  
        // each of the scalar properties in the complex type. 
        protected void ReportMemberChanged(string scalarPropertyName)
        {
            if (null != _complexChangeTracker)
            {
                _complexChangeTracker.EntityComplexMemberChanged(_rootComplexPropertyName,
                                                          this, scalarPropertyName);
            }
        }
    }
    [EdmComplexTypeAttribute(NamespaceName = "Microsoft.Samples.Edm", Name = "OrderInfo")]
    public partial class OrderInfo : ComplexTypeChangeTracker
    {
        private string _orderNumber;
        private string _purchaseOrder;
        private string _accountNumber;
        private string _comment;

        override public void SetComplexChangeTracker(string rootComplexPropertyName, IEntityChangeTracker changeTracker)
        {
            // Call SetChangeTracker on the base class to set the change tracker  
            // and the name of the root complex type property on the entity. 
            base.SetComplexChangeTracker(rootComplexPropertyName, changeTracker);
        }

        [EdmScalarPropertyAttribute(IsNullable = false)]
        public string OrderNumber
        {
            get
            {
                return _orderNumber;
            }
            set
            {
                // Validate the value before setting it. 
                if (value.Length > 25)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidString,
                              new string[3] { value, "OrderNumber", "25" }));
                }
                // Report the change if the change tracker exists. 
                if (_complexChangeTracker != null)
                {
                    ReportMemberChanging("OrderNumber");
                    _orderNumber = value;
                    ReportMemberChanged("OrderNumber");
                }
                else
                {
                    _orderNumber = value;
                }
            }
        }
        [EdmScalarPropertyAttribute()]
        public string PurchaseOrder
        {
            get
            {
                return _purchaseOrder;
            }
            set
            {
                // Validate the value before setting it. 
                if ((value != null) && value.Length > 25)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidString,
                              new string[3] { value, "PurchaseOrder", "25" }));
                }
                if (_purchaseOrder != value)
                {
                    // Report the change if the change tracker exists. 
                    if (_complexChangeTracker != null)
                    {
                        ReportMemberChanging("PurchaseOrder");
                        _purchaseOrder = value;
                        ReportMemberChanged("PurchaseOrder");
                    }
                    else
                    {
                        _purchaseOrder = value;
                    }
                }
            }
        }
        [EdmScalarPropertyAttribute()]
        public string AccountNumber
        {
            get
            {
                return _accountNumber;
            }
            set
            {
                // Validate the value before setting it. 
                if ((value != null) && value.Length > 15)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidString,
                              new string[3] { value, "AccountNumber", "15" }));
                }
                if (_purchaseOrder != value)
                {
                    // Report the change if the change tracker exists. 
                    if (_complexChangeTracker != null)
                    {
                        ReportMemberChanging("AccountNumber");
                        _accountNumber = value;
                        ReportMemberChanged("AccountNumber");
                    }
                    else
                    {
                        _accountNumber = value;
                    }
                }
            }
        }
        [EdmScalarPropertyAttribute()]
        public string Comment
        {
            get
            {
                return _comment;
            }
            set
            {
                // Validate the value before setting it. 
                if ((value != null) && value.Length > 128)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidString,
                              new string[3] { value, "Comment", "128" }));
                }
                if (_comment != value)
                {
                    // Report the change if the change tracker exists. 
                    if (_complexChangeTracker != null)
                    {
                        ReportMemberChanging("Comment");
                        _comment = value;
                        ReportMemberChanged("Comment");
                    }
                    else
                    {
                        _comment = value;
                    }
                }
            }
        }
    }

    [EdmEntityTypeAttribute(NamespaceName = "Microsoft.Samples.Edm", 
        Name = "LineItem")]
    public class LineItem : IEntityWithRelationships, 
        IEntityWithChangeTracker, IEntityWithKey   
    {
        // Define private property variables. 
        int _lineItemId; 
        string _trackingNumber;
        short _quantity;
        int _product;
        decimal _price;
        decimal _discount;
        decimal _total;

        IEntityChangeTracker _changeTracker = null;

        // Specify the IEntityChangeTracker to use for tracking changes. 
        void IEntityWithChangeTracker.SetChangeTracker(IEntityChangeTracker changeTracker)
        {
            _changeTracker = changeTracker;
        }

        EntityKey _entityKey = null;

        // Define the EntityKey property for the class.
        EntityKey IEntityWithKey.EntityKey
        {
            get
            {
                return _entityKey;
            }
            set
            {
                // Set the EntityKey property, if it is not set. 
                // Changing an existing value will cause an exception. 
                if (_entityKey == null)
                {
                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging(StructuralObject.EntityKeyPropertyName);
                        _entityKey = value;
                        _changeTracker.EntityMemberChanged(StructuralObject.EntityKeyPropertyName);
                    }
                    else
                    {
                        _entityKey = value;
                    }
                }
            }
        }

        RelationshipManager _relationships = null;

        // Define a relationship manager for the class.
        RelationshipManager IEntityWithRelationships.RelationshipManager
        {
            get
            {
                if (null == _relationships)
                    _relationships = RelationshipManager.Create(this);
                return _relationships;
            }
        }

        // Defines a navigation property to the Order class.
        [EdmRelationshipNavigationPropertyAttribute("Microsoft.Samples.Edm", "FK_LineItem_Order_OrderId", "Order")]
        public Order Order
        {
            get
            {
                return ((IEntityWithRelationships)(this)).RelationshipManager.
                    GetRelatedReference<Order>("FK_LineItem_Order_OrderId", "Order").Value;
            }
            set
            {
                ((IEntityWithRelationships)(this)).RelationshipManager.
                    GetRelatedReference<Order>("FK_LineItem_Order_OrderId", "Order").Value = value;
            }
        }
        [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
        public int LineItemId
        {
            get
            {
                return _lineItemId;
            }
            set
            {
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("LineItemId");
                    _lineItemId = value;
                    _changeTracker.EntityMemberChanged("LineItemId");
                }
                else
                {
                    _lineItemId = value;
                }
            }
        }
        [EdmScalarPropertyAttribute()]
        public string TrackingNumber
        {
            get
            {
                return _trackingNumber;
            }
            set
            {
                if (_trackingNumber != value)
                {
                    // Validate the value before setting it. 
                    if (value.Length > 25)
                    {
                        throw new ApplicationException(string.Format(
                                  Properties.Resources.propertyNotValidString,
                                  new string[3] {value,"TrackingNumber", "25"}));
                    }
                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging("TrackingNumber");
                        _trackingNumber = value;
                        _changeTracker.EntityMemberChanged("TrackingNumber");
                    }
                    else
                    {
                        _trackingNumber = value;
                    }
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public short Quantity
        {
            get
            {
                return _quantity;
            }
            set
            {
                if (_quantity != value)
                {
                    // Validate the value before setting it. 
                    if (value < 1)
                    {
                        throw new ApplicationException(string.Format(
                                  Properties.Resources.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "Quantity" }));
                    }
                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging("Quantity");
                        _quantity = value;
                        _changeTracker.EntityMemberChanged("Quantity");
                    }
                    else
                    {
                        _quantity = value;
                    }

                    // Update the line total.
                    CalculateLineTotal();
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int Product
        {
            get
            {
                return _product;
            }
            set
            {
                // Validate the value before setting it. 
                if (value < 1)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidNegative, 
                              new string[2] { value.ToString(), "Product" }));
                }
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("Product");
                    _product = value;
                    _changeTracker.EntityMemberChanged("Product");
                }
                else
                {
                    _product = value;
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)] 
        public decimal Price
        {
            get
            {
                return _price;
            }
            set
            {
                if (_price != value)
                {
                    // Validate the value before setting it. 
                    if (value < 0)
                    {
                        throw new ApplicationException(string.Format(
                                  Properties.Resources.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "Price" }));
                    }
                    // Report the change if the change tracker exists. 
                    if (_changeTracker != null)
                    {
                        _changeTracker.EntityMemberChanging("Price");
                        _price = value;
                        _changeTracker.EntityMemberChanged("Price");
                    }
                    else 
                    { 
                        _price = value;
                    }

                    // Update the line total.
                    CalculateLineTotal();
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public decimal Discount
        {
            get
            {
                return _discount;
            }
            set
            {
                // Validate the value before setting it. 
                if (value < 0)
                {
                    throw new ApplicationException(string.Format(
                              Properties.Resources.propertyNotValidNegative,
                              new string[2] { value.ToString(), "Discount" }));
                }
                // Report the change if the change tracker exists. 
                if (_changeTracker != null)
                {
                    _changeTracker.EntityMemberChanging("Discount");
                    _discount = value;
                    _changeTracker.EntityMemberChanged("Discount");
                }
                else
                {
                    _discount = value;
                }
            }
        }

        public decimal Total
        {
            get
            {
                return _total;
            }
        }

        private void CalculateLineTotal()
        {
            _total = (_quantity * (_price - _discount)); 
        }
    }
}

Windows 7, Windows Vista, Windows XP SP2, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5 SP1

Community Additions

ADD
Show:
© 2014 Microsoft