//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Xml.Linq;
using System.IO.Compression;
namespace SchoolSample.EntityModel
{
[DataContract(IsReference = true)]
[KnownType(typeof(Course))]
public partial class Instructor : Person, IObjectWithChangeTracker, INotifyPropertyChanged
{
#region Simple Properties
[DataMember]
[Display(ResourceType=typeof(SchoolSample.EntityModel.Resource.SchoolModelResource),
Name="InstructorHireDateField", Description="InstructorHireDateFieldDescription")]
public Nullable<System.DateTime> HireDate
{
get { return _hireDate; }
set
{
if (_hireDate != value)
{
ChangeTracker.RecordOriginalValue("HireDate", _hireDate);
PropertySetterEntry("HireDate");
_hireDate = value;
PropertySetterExit("HireDate", value);
OnPropertyChanged("HireDate");
}
}
}
private Nullable<System.DateTime> _hireDate;
[DataMember]
[Display(ResourceType=typeof(SchoolSample.EntityModel.Resource.SchoolModelResource),
Name="InstructorSalaryField", Description="InstructorSalaryFieldDescription")]
[CustomValidation(typeof(SchoolSample.EntityModel.Instructor), "ValidateInstructorSalary")]
public Nullable<decimal> Salary
{
get { return _salary; }
set
{
if (_salary != value)
{
ChangeTracker.RecordOriginalValue("Salary", _salary);
PropertySetterEntry("Salary");
_salary = value;
PropertySetterExit("Salary", value);
OnPropertyChanged("Salary");
}
}
}
private Nullable<decimal> _salary;
#endregion
#region Navigation Properties
[DataMember]
public TrackableCollection<Course> Courses
{
get
{
if (_courses == null)
{
_courses = new TrackableCollection<Course>();
_courses.CollectionChanged += FixupCourses;
}
return _courses;
}
set
{
if (!ReferenceEquals(_courses, value))
{
if (ChangeTracker.ChangeTrackingEnabled)
{
throw new InvalidOperationException("Cannot set the FixupChangeTrackingCollection when ChangeTracking is enabled");
}
if (_courses != null)
{
_courses.CollectionChanged -= FixupCourses;
}
_courses = value;
if (_courses != null)
{
_courses.CollectionChanged += FixupCourses;
}
OnNavigationPropertyChanged("Courses");
}
}
}
private TrackableCollection<Course> _courses;
#endregion
#region ChangeTracking
protected override void ClearNavigationProperties()
{
base.ClearNavigationProperties();
Courses.Clear();
}
#endregion
#region Validation and Helper Method
/// <summary>
/// Loops through all related data annotation attributes as well as all related
/// custom validation actions for the specified property name. If propertyName
/// is String.Empty/null, the validation is on the entity level.
/// </summary>
/// <param name="propertyName">Propery name or String.Empty/null for top-level errors</param>
/// <param name="value">New value that needs to be validated for the specified property</param>
public override void Validate(string propertyName, object value)
{
// call base Validate() first
base.Validate(propertyName, value);
// next, process custom validation actions
if (ValidationActions.Count == 0) InitializeValidationSettings();
if (string.IsNullOrEmpty(propertyName))
{
// loop through all properties and call its list of validation actions
foreach (string memberName in ValidationActions.Keys.ToList())
{
List<Action<object>> actions = ValidationActions[memberName];
if (string.IsNullOrEmpty(memberName))
{
// this is top-level validation
actions.ForEach(action => action(this));
}
else
{
// this is validation for each property
object memberValue = GetType().GetProperty(memberName).GetValue(this, null);
actions.ForEach(action => action(memberValue));
}
}
}
else
{
if (ValidationActions.ContainsKey(propertyName))
{
List<Action<object>> actions = ValidationActions[propertyName];
actions.ForEach(action => action(value));
}
}
}
#if SILVERLIGHT
/// <summary>
/// Client-side validation function to loop through all data annotation
/// attributes and all custom validation actions. If any validation fails,
/// this function will return false. Otherwise, true.
/// </summary>
/// <returns></returns>
public override bool TryValidate()
{
// call base TryValidate() first
base.TryValidate();
// next, process custom validation actions
if (ValidationActions.Count == 0) InitializeValidationSettings();
// loop through all properties and call its list of validation actions
foreach (string propertyName in ValidationActions.Keys.ToList())
{
List<Action<object>> actions = ValidationActions[propertyName];
if (string.IsNullOrEmpty(propertyName))
{
// this is top-level validation
actions.ForEach(action => action(this));
}
else
{
// this is validation for each property
object value = GetType().GetProperty(propertyName).GetValue(this, null);
actions.ForEach(action => action(value));
}
}
return !(((INotifyDataErrorInfo)this).HasErrors);
}
internal override void TryValidateObjectGraph(ref bool validated, ref List<object> visitedGraph)
{
// if already visited this object, just return
if (visitedGraph.Any(n => ReferenceEquals(n, this))) return;
if (!TryValidate()) validated = false;
visitedGraph.Add(this);
// call TryValidateObjectGraph() on all Navigation properties
TryValidateOnNavigationProperties(ref validated, ref visitedGraph);
}
internal override void TryValidateOnNavigationProperties(ref bool validated, ref List<object> visitedGraph)
{
// call base TryValidateOnNavigationProperties() first
base.TryValidateOnNavigationProperties(ref validated, ref visitedGraph);
foreach (var item in Courses)
{
item.TryValidateObjectGraph(ref validated, ref visitedGraph);
}
}
#elif WPF
/// <summary>
/// Client-side validation function to loop through all data annotation
/// attributes and all custom validation actions. If any validation fails,
/// this function will return false. Otherwise, true.
/// </summary>
/// <returns></returns>
public override bool TryValidate()
{
// call base TryValidate() first
base.TryValidate();
// Next, process custom validation actions
if (ValidationActions.Count == 0) InitializeValidationSettings();
// loop through all properties and call its list of validation actions
foreach (string propertyName in ValidationActions.Keys.ToList())
{
List<Action<object>> actions = ValidationActions[propertyName];
if (string.IsNullOrEmpty(propertyName))
{
// this is top-level validation
actions.ForEach(action => action(this));
}
else
{
// this is validation for each property
object value = GetType().GetProperty(propertyName).GetValue(this, null);
actions.ForEach(action => action(value));
}
}
return (ValidationErrors.Count == 0);
}
internal override void TryValidateObjectGraph(ref bool validated, ref List<object> visitedGraph)
{
// if already visited this object, just return
if (visitedGraph.Any(n => ReferenceEquals(n, this))) return;
if (!TryValidate()) validated = false;
visitedGraph.Add(this);
// call TryValidateObjectGraph() on all Navigation properties
TryValidateOnNavigationProperties(ref validated, ref visitedGraph);
}
internal override void TryValidateOnNavigationProperties(ref bool validated, ref List<object> visitedGraph)
{
// call base TryValidateOnNavigationProperties() first
base.TryValidateOnNavigationProperties(ref validated, ref visitedGraph);
foreach (var item in Courses)
{
item.TryValidateObjectGraph(ref validated, ref visitedGraph);
}
}
#else
/// <summary>
/// Server-side validation function to loop through all data annotation
/// attributes and all custom validation actions. If any validation fails,
/// it will throw an exception.
/// </summary>
public override void Validate()
{
// call base Validate() first
base.Validate();
// Next, process custom validation actions
if (ValidationActions.Count == 0) InitializeValidationSettings();
// loop through all properties and call its list of validation actions
foreach (string propertyName in ValidationActions.Keys.ToList())
{
List<Action<object>> actions = ValidationActions[propertyName];
if (string.IsNullOrEmpty(propertyName))
{
// this is top-level validation
actions.ForEach(action => action(this));
}
else
{
// this is validation for each property
object value = GetType().GetProperty(propertyName).GetValue(this, null);
actions.ForEach(action => action(value));
}
}
}
internal override void ValidateObjectGraph(ref List<object> visitedGraph)
{
// if already visited this object, just return
if (visitedGraph.Any(n => ReferenceEquals(n, this))) return;
Validate();
visitedGraph.Add(this);
// call ValidateObjectGraph() on all Navigation properties
ValidateOnNavigationProperties(ref visitedGraph);
}
internal override void ValidateOnNavigationProperties(ref List<object> visitedGraph)
{
// call base ValidateOnNavigationProperties() first
base.ValidateOnNavigationProperties(ref visitedGraph);
foreach (var item in Courses)
{
item.ValidateObjectGraph(ref visitedGraph);
}
}
#endif
partial void PropertySetterEntry(string propertyName);
partial void PropertySetterExit(string propertyName, object propertyValue);
partial void InitializeValidationSettings();
private Dictionary<string, List<Action<object>>> ValidationActions
{
get
{
if (_validationActions == null)
{
_validationActions = new Dictionary<string, List<Action<object>>>();
}
return _validationActions;
}
}
private Dictionary<string, List<Action<object>>> _validationActions;
/// <summary>
/// Add one validation action for the specified property name.
/// </summary>
/// <param name="propertyName">Propery name or String.Empty/null for top-level errors</param>
/// <param name="validationAction">Function to carry out a specific validation action</param>
private void AddPropertyValidationAction(string propertyName, Action<object> validationAction)
{
List<Action<object>> validationActionList;
if (!ValidationActions.ContainsKey(propertyName))
{
validationActionList = new List<Action<object>>();
ValidationActions.Add(propertyName, validationActionList);
}
else
validationActionList = ValidationActions[propertyName];
validationActionList.Add(validationAction);
}
#endregion
#region Association Fixup
private void FixupCourses(object sender, NotifyCollectionChangedEventArgs e)
{
if (IsDeserializing)
{
return;
}
if (e.NewItems != null)
{
foreach (Course item in e.NewItems)
{
item.Instructor = this;
if (ChangeTracker.ChangeTrackingEnabled)
{
if (!item.ChangeTracker.ChangeTrackingEnabled)
{
item.StartTracking();
}
ChangeTracker.RecordAdditionToCollectionProperties("Courses", item);
}
}
}
if (e.OldItems != null)
{
foreach (Course item in e.OldItems)
{
if (ReferenceEquals(item.Instructor, this))
{
item.Instructor = null;
}
if (ChangeTracker.ChangeTrackingEnabled)
{
ChangeTracker.RecordRemovalFromCollectionProperties("Courses", item);
}
}
}
}
#endregion
}
}