How to: Inherit from the EntityObject and ComplexObject Base Classes (Entity Framework)

When you use custom data classes with an Entity Data Model (EDM), you must update the custom data classes to inherit from EntityObject and ComplexObject. You must also apply EDM attributes that map the custom classes and properties to entity types and complex types defined in the conceptual schema definition language (CSDL) file. For more information, see How to: Map Custom Objects to Entities (Entity Framework).

Instead of inheriting from EntityObject or ComplexObject, you can also implement custom data class interfaces. For more information, see Implementing Custom Data Class Interfaces (Entity Framework).

To inherit from EntityObject

  1. Modify the definition of each custom data class so that it inherits from EntityObject, as in the following example:

    <EdmEntityTypeAttribute(NamespaceName:="Microsoft.Samples.Entity", Name:="Order")> _
    Public Class Order
        Inherits EntityObject
    
    [EdmEntityTypeAttribute(NamespaceName="Microsoft.Samples.Entity",Name="Order")]
    public class Order : EntityObject 
    
  2. In the settable scalar properties of each data class, add a call to ReportPropertyChanging before you set the property value, and add a call to ReportPropertyChanged after the property is set. This is shown in the following example:

    Set(ByVal value As Integer)
        ReportPropertyChanging("OrderId")
        _orderId = value
        ReportPropertyChanged("OrderId")
    End Set
    
    set
    {
        ReportPropertyChanging("OrderId");
        _orderId = value;
        ReportPropertyChanged("OrderId");
    }
    

To inherit from ComplexObject

  1. Modify the definition of each custom complex data class so that it inherits from ComplexObject, as in the following example:

    <Global.System.Data.Objects.DataClasses.EdmComplexTypeAttribute( _
        NamespaceName:="Microsoft.Samples.Entity", Name:="OrderInfo")> _
    Partial Public Class OrderInfo
        Inherits Global.System.Data.Objects.DataClasses.ComplexObject
    
    [EdmComplexTypeAttribute(NamespaceName = 
        "Microsoft.Samples.Entity", Name = "OrderInfo")]
    public partial class OrderInfo : ComplexObject
    
  2. In the settable scalar properties of each complex data class, add a call to ReportPropertyChanging before you set the property value, and add a call to ReportPropertyChanged after the property is set. This is shown in the following example:

    ' Validate the value before setting it.
    If (value <> Nothing) AndAlso value.Length > 25 Then
        Throw New ApplicationException(String.Format( _
                  Errors.propertyNotValidString, _
                  "PurchaseOrder", "25"))
    End If
    If _purchaseOrder <> value Then
        ReportPropertyChanging("PurchaseOrder")
        _purchaseOrder = value
        ReportPropertyChanged("PurchaseOrder")
    End If
    
    // Validate the value before setting it.
    if ((value != null) && value.Length > 25)
    {
        throw new ApplicationException(string.Format(
                  Errors.propertyNotValidString,
                  new string[3] { value, "PurchaseOrder", "25" }));
    }
    if (_purchaseOrder != value)
    {
        ReportPropertyChanging("PurchaseOrder");
        _purchaseOrder = value;
        ReportPropertyChanged("PurchaseOrder");
    }
    

Example

This example shows the custom data classes Order and LineItem and the complex data class OrderInfo. These custom classes are mapped to the SalesOrderHeader and SalesOrderDetail tables in the AdventureWorks database. The Order and LineItem classes inherit from EntityObject, and the complex OrderInfo data class inherits from ComplexObject.

Option Explicit On
Option Strict On

Imports System
Imports System.Data.SqlTypes
Imports System.Collections.Generic
Imports System.Text
Imports System.Data
Imports System.Data.Objects.DataClasses
Imports System.Data.Metadata.Edm

<Assembly: EdmSchemaAttribute()> 
<Assembly: EdmRelationshipAttribute("Microsoft.Samples.Entity", _
    "LineItem_Order_OrderId", "Order", _
    RelationshipMultiplicity.One, GetType(Order), "LineItems", _
    RelationshipMultiplicity.Many, GetType(LineItem))> 
<EdmEntityTypeAttribute(NamespaceName:="Microsoft.Samples.Entity", Name:="Order")> _
Public Class Order
    Inherits EntityObject
    ' Define private property variables.
    Private _orderId As Integer
    Private _revision As Byte
    Private _orderDate As DateTime
    Private _dueDate As DateTime
    Private _shipDate As DateTime
    Private _onlineOrder As Boolean
    Private _status As Byte
    Private _customer As Integer
    Private _contact As Integer
    Private _billToAddress As Integer
    Private _shipToAddress As Integer
    Private _shipMethod As Integer
    Private _subTotal As Decimal
    Private _tax As Decimal
    Private _freight As Decimal
    Private _totalDue As Decimal
    Private _extendedInfo As OrderInfo
    Private _rowGuid As Guid
    Private _modifiedDate As DateTime

    'Default Constructor.
    Sub New()

    End Sub
    ' Public properties of the Order object.
    <EdmScalarPropertyAttribute(EntityKeyProperty:=True, IsNullable:=False)> _
    Public Property OrderId() As Integer
        Get
            Return _orderId
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("OrderId")
            _orderId = value
            ReportPropertyChanged("OrderId")
        End Set
    End Property
    ' Navigation property that returns a collection of line items.
    <EdmRelationshipNavigationPropertyAttribute("Microsoft.Samples.Entity", _
            "LineItem_Order_OrderId", "LineItems")> _
    Public ReadOnly Property LineItems() As EntityCollection(Of LineItem)
        Get
            Return CType(Me, IEntityWithRelationships).RelationshipManager _
                .GetRelatedCollection(Of LineItem) _
            ("LineItem_Order_OrderId", "LineItems")
        End Get
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Revision() As Byte
        Get
            Return _revision
        End Get
        Set(ByVal value As Byte)
            ReportPropertyChanging("Revision")
            _revision = value
            ReportPropertyChanged("Revision")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property OrderDate() As Date
        Get
            Return _orderDate
        End Get
        Set(ByVal value As DateTime)
            ReportPropertyChanging("OrderDate")
            _orderDate = value
            ReportPropertyChanged("OrderDate")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property DueDate() As Date
        Get
            Return _dueDate
        End Get
        Set(ByVal value As Date)
            ReportPropertyChanging("DueDate")
            _dueDate = value
            ReportPropertyChanged("DueDate")
        End Set
    End Property
    <EdmScalarPropertyAttribute()> _
    Public Property ShipDate() As Date
        Get
            Return _shipDate
        End Get
        Set(ByVal value As Date)
            ReportPropertyChanging("ShipDate")
            _shipDate = value
            ReportPropertyChanged("ShipDate")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property OnlineOrder() As Boolean
        Get
            Return _onlineOrder
        End Get
        Set(ByVal value As Boolean)
            ReportPropertyChanging("OnlineOrder")
            _onlineOrder = value
            ReportPropertyChanged("OnlineOrder")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Status() As Byte
        Get
            Return _status
        End Get
        Set(ByVal value As Byte)
            If _status <> value Then
                ReportPropertyChanging("Status")
                _status = value
                ReportPropertyChanged("Status")
            End If
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Customer() As Integer
        Get
            Return _customer
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("Customer")
            _customer = value
            ReportPropertyChanged("Customer")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Contact() As Integer
        Get
            Return _contact
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("Contact")
            _contact = value
            ReportPropertyChanged("Contact")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property BillToAddress() As Integer
        Get
            Return _billToAddress
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("BillToAddress")
            _billToAddress = value
            ReportPropertyChanged("BillToAddress")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property ShipToAddress() As Integer
        Get
            Return _shipToAddress
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("ShipToAddress")
            _shipToAddress = value
            ReportPropertyChanged("ShipToAddress")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property ShipMethod() As Integer
        Get
            Return _shipMethod
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("ShipMethod")
            _shipMethod = value
            ReportPropertyChanged("ShipMethod")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property SubTotal() As Decimal
        Get
            Return _subTotal
        End Get
        Set(ByVal value As Decimal)
            If _subTotal <> value Then
                ' Validate the value before setting it.
                If value < 0 Then
                    Throw New ApplicationException(String.Format( _
                              Errors.propertyNotValidNegative, _
                              value.ToString, "SubTotal"))
                End If
                ReportPropertyChanging("SubTotal")
                _subTotal = value
                ReportPropertyChanged("SubTotal")

                ' Recalculate the order total.
                CalculateOrderTotal()
            End If
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Tax() As Decimal
        Get
            Return _tax
        End Get
        Set(ByVal value As Decimal)
            ' Validate the value before setting it.
            If value < 0 Then
                Throw New ApplicationException(String.Format( _
                          Errors.propertyNotValidNegative, _
                          value.ToString(), "Tax"))
            End If
            ReportPropertyChanging("TaxAmt")
            _tax = value
            ReportPropertyChanged("TaxAmt")

            ' Recalculate the order total.
            CalculateOrderTotal()
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Freight() As Decimal
        Get
            Return _freight
        End Get
        Set(ByVal value As Decimal)
            If _freight <> value Then
                ' Validate the value before setting it.
                If value < 0 Then
                    Throw New ApplicationException(String.Format( _
                              Errors.propertyNotValidNegative, _
                    value.ToString(), "Freight"))
                End If
                ReportPropertyChanging("Freight")
                _freight = value
                ReportPropertyChanging("Freight")

                ' Recalculate the order total.
                CalculateOrderTotal()
            End If
        End Set
    End Property
    Public ReadOnly Property TotalDue() As Decimal
        Get
            Return _totalDue
        End Get
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
      Public Property RowGuid() As Guid
        Get
            Return _rowGuid
        End Get
        Set(ByVal value As Guid)
            ReportPropertyChanging("RowGuid")
            _rowGuid = value
            ReportPropertyChanged("RowGuid")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
      Public Property ModifiedDate() As DateTime
        Get
            Return _modifiedDate
        End Get
        Set(ByVal value As DateTime)
            ReportPropertyChanging("ModifiedDate")
            _modifiedDate = value
            ReportPropertyChanged("ModifiedDate")
        End Set
    End Property
    <EdmComplexPropertyAttribute()> _
    Public Property ExtendedInfo() As OrderInfo
        Get
            Return _extendedInfo
        End Get
        Set(ByVal value As OrderInfo)
            ReportPropertyChanging("ExtendedInfo")
            _extendedInfo = value
            ReportPropertyChanged("ExtendedInfo")
        End Set
    End Property
    Private Sub CalculateOrderTotal()
        ' Update the total due as a sum of the other cost properties.
        _totalDue = _subTotal + _tax + _freight
    End Sub
End Class
<Global.System.Data.Objects.DataClasses.EdmComplexTypeAttribute( _
    NamespaceName:="Microsoft.Samples.Entity", Name:="OrderInfo")> _
Partial Public Class OrderInfo
    Inherits Global.System.Data.Objects.DataClasses.ComplexObject
    Private _orderNumber As String
    Private _purchaseOrder As String
    Private _accountNumber As String
    Private _comment As String
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
Public Property OrderNumber() As String
        Get
            Return _orderNumber
        End Get
        Set(ByVal value As String)
            ' Validate the value before setting it.
            If value.Length > 25 Then
                Throw New ApplicationException(String.Format( _
                    Errors.propertyNotValidString, _
                    "OrderNumber", "25"))
            End If
            ReportPropertyChanging("OrderNumber")
            _orderNumber = value
            ReportPropertyChanged("OrderNumber")
        End Set
    End Property
    <EdmScalarPropertyAttribute()> _
    Public Property PurchaseOrder() As String
        Get
            Return _purchaseOrder
        End Get
        Set(ByVal value As String)
            ' Validate the value before setting it.
            If (value <> Nothing) AndAlso value.Length > 25 Then
                Throw New ApplicationException(String.Format( _
                          Errors.propertyNotValidString, _
                          "PurchaseOrder", "25"))
            End If
            If _purchaseOrder <> value Then
                ReportPropertyChanging("PurchaseOrder")
                _purchaseOrder = value
                ReportPropertyChanged("PurchaseOrder")
            End If
        End Set
    End Property
    <EdmScalarPropertyAttribute()> _
    Public Property AccountNumber() As String
        Get
            Return _accountNumber
        End Get
        Set(ByVal value As String)
            ' Validate the value before setting it.
            If (value <> Nothing) AndAlso value.Length > 15 Then
                Throw New ApplicationException(String.Format( _
                          Errors.propertyNotValidString, _
                          "AccountNumber", "15"))
            End If
            ReportPropertyChanging("AccountNumber")
            _accountNumber = value
            ReportPropertyChanged("AccountNumber")
        End Set
    End Property
    <EdmScalarPropertyAttribute()> _
Public Property Comment() As String
        Get
            Return _comment
        End Get
        Set(ByVal value As String)
            ' Validate the value before setting it.
            If (value <> Nothing) AndAlso value.Length > 128 Then
                Throw New ApplicationException(String.Format( _
                          Errors.propertyNotValidString, _
                          "Comment", "128"))
            End If
            If _comment <> value Then
                ReportPropertyChanging("Comment")
                _comment = value
                ReportPropertyChanged("Comment")
            End If
        End Set
    End Property
End Class
<EdmEntityTypeAttribute(NamespaceName:="Microsoft.Samples.Entity", _
                        Name:="LineItem")> _
Public Class LineItem
    Inherits EntityObject

    ' Define private property variables.
    Private _orderId As Integer
    Private _lineItemId As Integer
    Private _trackingNumber As String
    Private _quantity As Short
    Private _special As Integer
    Private _product As Integer
    Private _price As Decimal
    Private _discount As Decimal
    Private _total As Decimal
    Private _rowGuid As Guid
    Private _modifiedDate As DateTime

    Sub New()
    End Sub
    ' Defines a navigation property to the Order class.
    <EdmRelationshipNavigationPropertyAttribute("Microsoft.Samples.Entity", _
            "LineItem_Order_OrderId", "Order")> _
    Public Property Order() As Order
        Get
            Return CType(Me,  _
            IEntityWithRelationships).RelationshipManager _
                .GetRelatedReference(Of Order) _
                ("LineItem_Order_OrderId", "Order").Value
        End Get
        Set(ByVal value As Order)
            CType(Me,  _
            IEntityWithRelationships).RelationshipManager _
                .GetRelatedReference(Of Order) _
                ("LineItem_Order_OrderId", "Order").Value = value
        End Set
    End Property
    <EdmScalarPropertyAttribute(EntityKeyProperty:=True, IsNullable:=False)> _
    Public Property OrderId() As Integer
        Get
            Return _orderId
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("OrderId")
            _orderId = value
            ReportPropertyChanged("OrderId")
        End Set
    End Property
    <EdmScalarPropertyAttribute(EntityKeyProperty:=True, IsNullable:=False)> _
    Public Property LineItemId() As Integer
        Get
            Return _lineItemId
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("LineItemId")
            _lineItemId = value
            ReportPropertyChanged("LineItemId")
        End Set
    End Property
    <EdmScalarPropertyAttribute()> _
    Public Property TrackingNumber() As String
        Get
            Return _trackingNumber
        End Get
        Set(ByVal value As String)
            If _trackingNumber <> value Then
                ' Validate the value before setting it.
                If value.Length > 25 Then
                    Throw New ApplicationException(String.Format( _
                            Errors.propertyNotValidString, _
                            "TrackingNumber", "25"))
                End If
                ReportPropertyChanging("TrackingNumber")
                _trackingNumber = value
                ReportPropertyChanged("TrackingNumber")
            End If
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Quantity() As Short
        Get
            Return _quantity
        End Get
        Set(ByVal value As Short)
            If _quantity <> value Then
                ' Validate the value before setting it.
                If value < 1 Then
                    Throw New ApplicationException(String.Format( _
                        Errors.propertyNotValidNegative, _
                        value.ToString(), "Quantity"))
                End If
                ReportPropertyChanging("Quantity")
                _quantity = value
                ReportPropertyChanged("Quantity")

                ' Update the line total.
                CalculateLineTotal()
            End If
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Special() As Integer
        Get
            Return _special
        End Get
        Set(ByVal value As Integer)
            ReportPropertyChanging("Special")
            _special = value
            ReportPropertyChanged("Special")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Product() As Integer
        Get
            Return _product
        End Get
        Set(ByVal value As Integer)
            ' Validate the value before setting it.
            If value < 1 Then
                Throw New ApplicationException(String.Format( _
                          Errors.propertyNotValidNegative, _
                          value.ToString(), "Product"))
            End If
            ReportPropertyChanging("Product")
            _product = value
            ReportPropertyChanged("Product")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Price() As Decimal
        Get
            Return _price
        End Get
        Set(ByVal value As Decimal)
            If _price <> value Then
                ' Validate the value before setting it.
                If value < 0 Then
                    Throw New ApplicationException(String.Format( _
                              Errors.propertyNotValidNegative, _
                              value.ToString(), "Price"))
                End If
                ReportPropertyChanging("Price")
                _price = value
                ReportPropertyChanged("Price")

                ' Update the line total.
                CalculateLineTotal()
            End If
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property Discount() As Decimal
        Get
            Return _discount
        End Get
        Set(ByVal value As Decimal)
            ' Validate the value before setting it.
            If value < 0 Then
                Throw New ApplicationException(String.Format( _
                          Errors.propertyNotValidNegative, _
                          value.ToString(), "Discount"))
            End If
            ReportPropertyChanging("Discount")
            _discount = value
            ReportPropertyChanged("Discount")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property RowGuid() As Guid
        Get
            Return _rowGuid
        End Get
        Set(ByVal value As Guid)
            ReportPropertyChanging("RowGuid")
            _rowGuid = value
            ReportPropertyChanged("RowGuid")
        End Set
    End Property
    <EdmScalarPropertyAttribute(IsNullable:=False)> _
    Public Property ModifiedDate() As DateTime
        Get
            Return _modifiedDate
        End Get
        Set(ByVal value As DateTime)
            ReportPropertyChanging("ModifiedDate")
            _modifiedDate = value
            ReportPropertyChanged("ModifiedDate")
        End Set
    End Property
    Public ReadOnly Property Total() As Decimal
        Get
            Return _total
        End Get
    End Property
    Private Sub CalculateLineTotal()
        _total = (_quantity * (_price - _discount))
    End Sub
End Class
Public Class Errors
    Public Const propertyNotValidNegative As String = _
            "The value '{0}' for the {1} property is not valid. It cannot be a negative number or zero."
    Public Const propertyNotValidString As String = _
            "The value '{0}' for the {1} property is not valid."
End Class
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.Entity;

[assembly: EdmSchemaAttribute()]
[assembly: EdmRelationshipAttribute("Microsoft.Samples.Entity",
    "LineItem_Order_OrderId", "Order",
    RelationshipMultiplicity.One, typeof(Order), "LineItems",
    RelationshipMultiplicity.Many, typeof(LineItem))]
namespace Microsoft.Samples.Entity
{   
    [EdmEntityTypeAttribute(NamespaceName="Microsoft.Samples.Entity",Name="Order")]
    public class Order : EntityObject 
    {
        // Define private property variables.
        private int _orderId;
        private byte _revision;
        private DateTime _orderDate;
        private DateTime _dueDate;
        private DateTime _shipDate;
        private bool _onlineOrder;
        private byte _status;
        private int _customer;
        private int _contact;
        private int _billToAddress;
        private int _shipToAddress;
        private int _shipMethod;
        private decimal _subTotal;
        private decimal _tax;
        private decimal _freight;
        private decimal _totalDue;
        private Guid _rowGuid;
        private DateTime _modifiedDate;
        private OrderInfo _extendedInfo;

        // Public properties of the Order object.
        [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
        public int OrderId
        {
            get 
            {
                return _orderId;
            }
            set
            {
                ReportPropertyChanging("OrderId");
                _orderId = value;
                ReportPropertyChanged("OrderId");
            }
        }

        // Navigation property that returns a collection of line items.
        [EdmRelationshipNavigationPropertyAttribute("Microsoft.Samples.Entity", "LineItem_Order_OrderId", "LineItems")]
        public EntityCollection<LineItem> LineItems
        {
            get
            {
                return ((IEntityWithRelationships)(this)).RelationshipManager.
                    GetRelatedCollection<LineItem>("Microsoft.Samples.Entity.LineItem_Order_OrderId", "LineItems");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public byte Revision
        {
            get
            {
                return _revision;
            }
            set
            {
                if (_revision != value)
                {
                    ReportPropertyChanging("Revision");
                    _revision = value;
                    ReportPropertyChanged("Revision");
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public DateTime OrderDate 
        {
           get 
            {
                return _orderDate;
            }
            set
            {
                ReportPropertyChanging("OrderDate");
                _orderDate = value;
                ReportPropertyChanged("OrderDate");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public DateTime DueDate 
        {
            get 
            {
                return _dueDate;
            }
            set
            {
                ReportPropertyChanging("DueDate");
                _dueDate = value;
                ReportPropertyChanged("DueDate");
            }
        }
        [EdmScalarPropertyAttribute()]
        public DateTime ShipDate
        {
            get
            {
                return _shipDate;
            }
            set
            {
                ReportPropertyChanging("ShipDate");
                _shipDate = value;
                ReportPropertyChanged("ShipDate");

            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public bool OnlineOrder
        {
            get
            {
                return _onlineOrder;
            }
            set
            {
                if (_onlineOrder != value)
                {
                   ReportPropertyChanging("OnlineOrder");
                   _onlineOrder = value;
                   ReportPropertyChanged("OnlineOrder");
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public byte Status
        {
            get 
            {
                return _status;
            }
            set
            {
                if (_status != value)
                {
                    ReportPropertyChanging("Status");
                    _status = value;
                    ReportPropertyChanged("Status");
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int Customer
        {
            get
            {
                return _customer;
            }
            set
            {
                ReportPropertyChanging("Customer");
                _customer = value;
                ReportPropertyChanged("Customer");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int Contact
        {
            get
            {
                return _contact;
            }
            set
            {
                ReportPropertyChanging("Contact");
                _contact = value;
                ReportPropertyChanged("Contact");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int BillToAddress
        {
            get
            {
                return _billToAddress;
            }
            set
            {
                ReportPropertyChanging("BillToAddress");
                _billToAddress = value;
                ReportPropertyChanged("BillToAddress");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int ShipToAddress
        {
            get
            {
                return _shipToAddress;
            }
            set
            {
                ReportPropertyChanging("ShipToAddress");
                _shipToAddress = value;
                ReportPropertyChanged("ShipToAddress");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int ShipMethod
        {
            get
            {
                return _shipMethod;
            }
            set
            {
                ReportPropertyChanging("ShipMethod");
                _shipMethod = value;
                ReportPropertyChanged("ShipMethod");
            }
        }
        [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(
                                  Errors.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "SubTotal" }));
                    }

                    ReportPropertyChanging("SubTotal");
                    _subTotal = value;
                    ReportPropertyChanged("SubTotal");

                    // Recalculate the order total.
                    CalculateOrderTotal();
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public decimal Tax
        {
            get
            {
                return _tax;
            }
            set
            {
                // Validate the value before setting it.
                if (value < 0)
                {
                    throw new ApplicationException(string.Format(
                              Errors.propertyNotValidNegative,
                              new string[2] { value.ToString(), "Tax" }));
                }

                ReportPropertyChanging("Tax");
                _tax = value;
                ReportPropertyChanged("Tax");

                // 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(
                                  Errors.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "Freight" }));
                    }

                    ReportPropertyChanging("Freight");
                    _freight = value;
                    ReportPropertyChanging("Freight");

                    // Recalculate the order total.
                    CalculateOrderTotal();
                }
            }

        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public Guid RowGuid
        {
            get
            {
                return _rowGuid;
            }
            set
            {
                ReportPropertyChanging("RowGuid");
                _rowGuid = value;
                ReportPropertyChanged("RowGuid");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public DateTime ModifiedDate
        {
            get
            {
                return _modifiedDate;
            }
            set
            {
                ReportPropertyChanging("ModifiedDate");
                _modifiedDate = value;
                ReportPropertyChanged("ModifiedDate");
            }
        }
        public decimal TotalDue
        {
            get
            {
                return _totalDue;
            }
        }

        [EdmComplexPropertyAttribute()]
        public OrderInfo ExtendedInfo
        {
            get
            {
                return _extendedInfo;
            }
            set
            {
                this.ReportPropertyChanging("ExtendedInfo");
                _extendedInfo = value;
                this.ReportPropertyChanged("ExtendedInfo");                
            }
        }
        private void CalculateOrderTotal()
        {
            // Update the total due as a sum of the other cost properties.
            _totalDue = _subTotal + _tax + _freight;
        }
}
    [EdmComplexTypeAttribute(NamespaceName = 
        "Microsoft.Samples.Entity", Name = "OrderInfo")]
    public partial class OrderInfo : ComplexObject
    {
        private string _orderNumber;
        private string _purchaseOrder;
        private string _accountNumber;
        private string _comment;

        [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(
                              Errors.propertyNotValidString,
                              new string[3] { value, "OrderNumber", "25" }));
                }

                ReportPropertyChanging("OrderNumber");
                _orderNumber = value;
                ReportPropertyChanged("OrderNumber");
            }
        }
        [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(
                              Errors.propertyNotValidString,
                              new string[3] { value, "PurchaseOrder", "25" }));
                }
                if (_purchaseOrder != value)
                {
                    ReportPropertyChanging("PurchaseOrder");
                    _purchaseOrder = value;
                    ReportPropertyChanged("PurchaseOrder");
                }
            }
        }
        [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(
                              Errors.propertyNotValidString,
                              new string[3] { value, "AccountNumber", "15" }));
                }
                ReportPropertyChanging("AccountNumber");
                _accountNumber = value;
                ReportPropertyChanged("AccountNumber");
            }
        }
        [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(
                              Errors.propertyNotValidString,
                              new string[3] { value, "Comment", "128" }));
                }
                if (_comment != value)
                {
                    ReportPropertyChanging("Comment");
                    _comment = value;
                    ReportPropertyChanged("Comment");
                }
            }
        }
    }

    [EdmEntityTypeAttribute(NamespaceName = "Microsoft.Samples.Entity", Name = "LineItem")]
    public class LineItem : EntityObject  
    {
        // Define private property variables.
        private int _orderId;
        private int _lineItemId;
        private string _trackingNumber;
        private short _quantity;
        private int _special;
        private int _product;
        private decimal _price;
        private decimal _discount;
        private decimal _total;
        private Guid _rowGuid;
        private DateTime _modifiedDate;

        // Default constructor.
        public LineItem()
        {

        }

        [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
        public int OrderId
        {
            get
            {
                return _orderId;
            }
            set
            {
                ReportPropertyChanging("OrderId");
                _orderId = value;
                ReportPropertyChanged("OrderId");
            }
        }
        // Defines a navigation property to the Order class.
        [EdmRelationshipNavigationPropertyAttribute("Microsoft.Samples.Entity", "LineItem_Order_OrderId", "Order")]
        public Order Order
        {
            get
            {
                return ((IEntityWithRelationships)(this)).RelationshipManager.
                    GetRelatedReference<Order>("LineItem_Order_OrderId", "Order").Value;
            }
            set
            {
                ((IEntityWithRelationships)(this)).RelationshipManager.
                    GetRelatedReference<Order>("LineItem_Order_OrderId", "Order").Value = value;
            }
        }
        [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)]
        public int LineItemId
        {
            get
            {
                return _lineItemId;
            }
            set
            {
                ReportPropertyChanging("LineItemId");
                _lineItemId = value;
                ReportPropertyChanged("LineItemId");
            }
        }
        [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(
                                  Errors.propertyNotValidString,
                                  new string[3] {value,"TrackingNumber", "25"}));
                    }
                    ReportPropertyChanging("TrackingNumber");
                    _trackingNumber = value;
                    ReportPropertyChanged("TrackingNumber");
                }
            }
        }
        [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(
                                  Errors.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "Quantity" }));
                    }
                    ReportPropertyChanging("Quantity");
                    _quantity = value;
                    ReportPropertyChanged("Quantity");
 
                    // Update the line total.
                    CalculateLineTotal();
                }
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int Special
        {
            get
            {
                return _special;
            }
            set
            {
                ReportPropertyChanging("Special");
                _special = value;
                ReportPropertyChanged("Special");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public int Product
        {
            get
            {
                return _product;
            }
            set
            {
                // Validate the value before setting it.
                if (value < 1)
                {
                    throw new ApplicationException(string.Format(
                              Errors.propertyNotValidNegative, 
                              new string[2] { value.ToString(), "Product" }));
                }
                ReportPropertyChanging("Product");
                _product = value;
                ReportPropertyChanged("Product");
            }
        }
        [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(
                                  Errors.propertyNotValidNegative,
                                  new string[2] { value.ToString(), "Price" }));
                    }

                    ReportPropertyChanging("Price");
                    _price = value;
                    ReportPropertyChanged("Price");

                    // 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(
                              Errors.propertyNotValidNegative,
                              new string[2] { value.ToString(), "Discount" }));
                }
                ReportPropertyChanging("Discount");
                _discount = value;
                ReportPropertyChanged("Discount");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public Guid RowGuid
        {
            get
            {
                return _rowGuid;
            }
            set
            {
                ReportPropertyChanging("RowGuid");
                _rowGuid = value;
                ReportPropertyChanged("RowGuid");
            }
        }
        [EdmScalarPropertyAttribute(IsNullable = false)]
        public DateTime ModifiedDate
        {
            get
            {
                return _modifiedDate;
            }
            set
            {
                ReportPropertyChanging("ModifiedDate");
                _modifiedDate = value;
                ReportPropertyChanged("ModifiedDate");
            }
        }
        public decimal Total
        {
            get
            {
                return _total;
            }
        }

        private void CalculateLineTotal()
        {
            _total = (_quantity * (_price - _discount)); 
        }
    }
    public class Errors
    {
        public const string propertyNotValidNegative =
            @"The value '{0}' for the {1} property is not valid. It cannot be a negative number or zero.";
        public const string propertyNotValidString =
            @"The value '{0}' for the {1} property is not valid.";
    }
}

See Also

Tasks

How to: Customize an Entity Data Model to Work with Custom Objects (Entity Framework)
How to: Implement Custom Data Class Interfaces (Entity Framework)

Concepts

Customizing Objects (Entity Framework)

Other Resources

Working with Custom Objects (Entity Framework Tasks)