9using System.Collections.Generic;
10using System.ComponentModel;
11using System.ComponentModel.DataAnnotations;
12using System.Diagnostics;
14using System.Linq.Expressions;
15using System.Reflection;
16using System.Threading.Tasks;
26using System.Collections.Concurrent;
53 #region Object ID Value
66 #region System.Object Overrides
77 return base.ToString();
90 InitializeBusinessRules();
114 #region Authorization
118 private ConcurrentDictionary<string, bool> _readResultCache;
121 private ConcurrentDictionary<string, bool> _executeResultCache;
124 private System.Security.Principal.IPrincipal _lastPrincipal;
126 private void InitializeBusinessRules()
129 if (!rules.Initialized)
131 if (!rules.Initialized)
136 rules.Initialized =
true;
160 if (_businessRules ==
null)
162 else if (_businessRules.Target ==
null)
163 _businessRules.SetTarget(
this);
164 return _businessRules;
177 void Rules.IHostRules.AllRulesComplete()
197 [EditorBrowsable(EditorBrowsableState.Advanced)]
202 VerifyAuthorizationCache();
204 if (!_readResultCache.TryGetValue(property.Name, out result))
208 _readResultCache.AddOrUpdate(property.Name, result, (a, b) => { return result; });
221 [EditorBrowsable(EditorBrowsableState.Advanced)]
225 if (throwOnFalse && result ==
false)
228 String.Format(
"{0} ({1})",
240 [EditorBrowsable(EditorBrowsableState.Advanced)]
256 if (propertyInfo ==
null)
258#if NETFX_CORE || (ANDROID || IOS)
260 Trace.TraceError(
"CanReadProperty: {0} is not a registered property of {1}.{2}", propertyName, this.GetType().Namespace, this.GetType().Name);
277 private void VerifyAuthorizationCache()
279 if (_readResultCache ==
null)
280 _readResultCache =
new ConcurrentDictionary<string, bool>();
281 if (_executeResultCache ==
null)
282 _executeResultCache =
new ConcurrentDictionary<string, bool>();
286 _readResultCache.Clear();
287 _executeResultCache.Clear();
298 [EditorBrowsable(EditorBrowsableState.Advanced)]
303 VerifyAuthorizationCache();
305 if (!_executeResultCache.TryGetValue(method.Name, out result))
308 _executeResultCache.AddOrUpdate(method.Name, result, (a, b) => { return result; });
321 [EditorBrowsable(EditorBrowsableState.Advanced)]
326 if (throwOnFalse && result ==
false)
343 [EditorBrowsable(EditorBrowsableState.Advanced)]
353 if (throwOnFalse && result ==
false)
365 object ICloneable.Clone()
374 [EditorBrowsable(EditorBrowsableState.Advanced)]
377 return Core.ObjectCloner.Clone(
this);
394 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Usage",
"CA1801:ReviewUnusedParameters", MessageId =
"criteria")]
395 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1822:MarkMembersAsStatic")]
396 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
397 private void DataPortal_Create(
object criteria)
402 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1822:MarkMembersAsStatic")]
403 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
404 private void DataPortal_Update()
409 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Usage",
"CA1801:ReviewUnusedParameters", MessageId =
"criteria")]
410 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1822:MarkMembersAsStatic")]
411 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
413 private void DataPortal_Delete(
object criteria)
423 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
424 [EditorBrowsable(EditorBrowsableState.Advanced)]
435 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
436 [EditorBrowsable(EditorBrowsableState.Advanced)]
448 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
449 [EditorBrowsable(EditorBrowsableState.Advanced)]
460 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
461 [EditorBrowsable(EditorBrowsableState.Advanced)]
471 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
472 [EditorBrowsable(EditorBrowsableState.Advanced)]
483 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
484 [EditorBrowsable(EditorBrowsableState.Advanced)]
491#region Serialization Notification
495 OnDeserializedHandler(
new System.Runtime.Serialization.StreamingContext());
498 [System.Runtime.Serialization.OnDeserialized()]
499 private void OnDeserializedHandler(System.Runtime.Serialization.StreamingContext context)
501 if (_fieldManager !=
null)
503 InitializeBusinessRules();
512 [EditorBrowsable(EditorBrowsableState.Advanced)]
513 protected virtual void OnDeserialized(System.Runtime.Serialization.StreamingContext context)
521#region Register Properties
541 return Core.FieldManager.PropertyInfoManager.RegisterProperty<P>(objectType, info);
559 return Core.FieldManager.PropertyInfoManager.RegisterProperty<P>(typeof(T), info);
583 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
598 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
626 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
655 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
682 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
698 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
730 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
735 #region Register Methods
752 var reflected = objectType.GetMethod(info.
Name);
753 if (reflected ==
null)
795 System.Reflection.
MethodInfo reflectedMethodInfo = Reflect<T>.GetMethod(methodLambdaExpression);
801#region Get Properties
823 return GetProperty<P>(propertyName, field, defaultValue, Security.NoAccessBehavior.SuppressException);
842 protected P
GetProperty<P>(
string propertyName, P field, P defaultValue, Security.NoAccessBehavior noAccess)
844#region Check to see if the property is marked with RelationshipTypes.PrivateField
917 var result = valueGenerator();
949 _lazyLoadingProperties.Add(property);
950 LoadPropertyAsync(property, factory);
976 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo.
Name, field, propertyInfo.
DefaultValue, Security.NoAccessBehavior.SuppressException));
1003 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo.
Name, field, propertyInfo.
DefaultValue, noAccess));
1022 return GetProperty<P>(propertyInfo, Security.NoAccessBehavior.SuppressException);
1045 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo, Security.NoAccessBehavior.SuppressException));
1071 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo, noAccess));
1093 P result =
default(P);
1113 object result =
null;
1128#region Read Properties
1145 return Utilities.CoerceValue<P>(typeof(F),
null, ReadProperty<F>(propertyInfo));
1158 P result =
default(P);
1166 result = (P)data.
Value;
1185 return MethodCaller.CallPropertyGetter(
this, propertyInfo.
Name);
1188 object result =
null;
1192 result = info.
Value;
1215 var result = valueGenerator();
1234 _lazyLoadingProperties.Add(property);
1235 LoadPropertyAsync(property, factory);
1240 P IManageProperties.LazyReadProperty<P>(
PropertyInfo<P> propertyInfo, Func<P> valueGenerator)
1242 return LazyReadProperty(propertyInfo, valueGenerator);
1245 P IManageProperties.LazyReadPropertyAsync<P>(PropertyInfo<P> propertyInfo, Task<P> factory)
1247 return LazyReadPropertyAsync(propertyInfo, factory);
1252#region Load Properties
1273 P oldValue =
default(P);
1275 if (fieldData ==
null)
1278 fieldData =
FieldManager.LoadFieldData(propertyInfo, oldValue);
1282 oldValue = (P)fieldData.
Value;
1285 if (oldValue ==
null)
1287 if (newValue !=
null)
1288 FieldManager.LoadFieldData(propertyInfo, Utilities.CoerceValue<P>(typeof(F), oldValue, newValue));
1290 else if (!(oldValue.Equals(newValue)))
1292 FieldManager.LoadFieldData(propertyInfo, Utilities.CoerceValue<P>(typeof(F), oldValue, newValue));
1295 catch (Exception ex)
1297 throw new PropertyLoadException(
string.Format(Properties.Resources.PropertyLoadException, propertyInfo.
Name, ex.Message));
1301 void Core.IManageProperties.LoadProperty<P>(
PropertyInfo<P> propertyInfo, P newValue)
1303 LoadProperty<P>(propertyInfo, newValue);
1306 bool Core.IManageProperties.FieldExists(Core.IPropertyInfo property)
1333 P oldValue =
default(P);
1335 if (fieldData ==
null)
1338 fieldData =
FieldManager.LoadFieldData(propertyInfo, oldValue);
1342 oldValue = (P)fieldData.
Value;
1345 if (oldValue ==
null)
1347 if (newValue !=
null)
1350 else if (!(oldValue.Equals(newValue)))
1355 catch (Exception ex)
1357 throw new PropertyLoadException(
string.Format(Properties.Resources.PropertyLoadException, propertyInfo.
Name, ex.Message));
1378 var t = this.GetType();
1379 var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
1380 var method = t.GetMethods(flags).Where(c => c.Name ==
"LoadProperty" && c.IsGenericMethod).FirstOrDefault();
1381 var gm = method.MakeGenericMethod(propertyInfo.
Type);
1382 var p =
new object[] { propertyInfo, newValue };
1388 private AsyncLoadManager _loadManager;
1389 internal AsyncLoadManager LoadManager
1393 if (_loadManager ==
null)
1396 _loadManager.BusyChanged += loadManager_BusyChanged;
1397 _loadManager.UnhandledAsyncException += loadManager_UnhandledAsyncException;
1399 return _loadManager;
1403 void loadManager_UnhandledAsyncException(
object sender,
ErrorEventArgs e)
1447 LoadManager.BeginLoad(
new TaskLoader<R>(property, factory));
1451#region Field Manager
1464 if (_fieldManager ==
null)
1468 return _fieldManager;
1474#region IsBusy / IsIdle
1478 private bool _isBusy;
1484 [EditorBrowsable(EditorBrowsableState.Advanced)]
1498 [EditorBrowsable(EditorBrowsableState.Advanced)]
1511 [Display(AutoGenerateField =
false)]
1512 [ScaffoldColumn(
false)]
1524 [Display(AutoGenerateField =
false)]
1525 [ScaffoldColumn(
false)]
1528 get {
return _isBusy || LoadManager.IsLoading; }
1556 [EditorBrowsable(EditorBrowsableState.Advanced)]
1566 [EditorBrowsable(EditorBrowsableState.Advanced)]
1569 if (_propertyBusy !=
null)
1570 _propertyBusy(
this, args);
1575#region IDataPortalTarget Members
1621#region IManageProperties Members
1623 bool IManageProperties.HasManagedProperties
1625 get {
return (_fieldManager !=
null && _fieldManager.
HasFields); }
1628 List<IPropertyInfo> IManageProperties.GetManagedProperties()
1633 object IManageProperties.GetProperty(
IPropertyInfo propertyInfo)
1638 object IManageProperties.LazyGetProperty<P>(PropertyInfo<P> propertyInfo, Func<P> valueGenerator)
1640 return LazyGetProperty(propertyInfo, valueGenerator);
1643 object IManageProperties.LazyGetPropertyAsync<P>(PropertyInfo<P> propertyInfo, Task<P> factory)
1645 return LazyGetPropertyAsync(propertyInfo, factory);
1648 object IManageProperties.ReadProperty(
IPropertyInfo propertyInfo)
1653 P IManageProperties.ReadProperty<P>(PropertyInfo<P> propertyInfo)
1658 void IManageProperties.SetProperty(
IPropertyInfo propertyInfo,
object newValue)
1660 throw new NotImplementedException(
"IManageProperties.SetProperty");
1663 void IManageProperties.LoadProperty(
IPropertyInfo propertyInfo,
object newValue)
1668 bool IManageProperties.LoadPropertyMarkDirty(
IPropertyInfo propertyInfo,
object newValue)
1674 List<object> IManageProperties.GetChildren()
1680#region MobileFormatter
1696 base.OnGetChildren(info, formatter);
1697 if (_fieldManager !=
null)
1699 var fieldManagerInfo = formatter.SerializeObject(_fieldManager);
1700 info.AddChild(
"_fieldManager", fieldManagerInfo.ReferenceId);
1717 if (info.Children.ContainsKey(
"_fieldManager"))
1719 var childData = info.Children[
"_fieldManager"];
1720 _fieldManager = (
FieldDataManager)formatter.GetObject(childData.ReferenceId);
1727#region INotifyUnhandledAsyncException Members
1731 private EventHandler<ErrorEventArgs> _unhandledAsyncException;
1739 add { _unhandledAsyncException = (EventHandler<ErrorEventArgs>)Delegate.Combine(_unhandledAsyncException, value); }
1740 remove { _unhandledAsyncException = (EventHandler<ErrorEventArgs>)Delegate.Remove(_unhandledAsyncException, value); }
1747 [EditorBrowsable(EditorBrowsableState.Advanced)]
1750 if (_unhandledAsyncException !=
null)
1751 _unhandledAsyncException(
this, error);
1760 [EditorBrowsable(EditorBrowsableState.Advanced)]
This class implements INotifyPropertyChanged and INotifyPropertyChanging in a serialization-safe mann...
virtual void OnPropertyChanged(string propertyName)
Call this method to raise the PropertyChanged event for a specific property.
Event arguments for the BusyChanged event.
Event arguments for an unhandled async exception.
Manages properties and property data for a business object.
bool HasFields
Gets a value indicating whether there are any managed fields available.
List< IPropertyInfo > GetRegisteredProperties()
Returns a copy of the property list for the business object.
override void OnSetChildren(SerializationInfo info, MobileFormatter formatter)
Deserializes child objects.
IFieldData GetFieldData(IPropertyInfo propertyInfo)
Gets the IFieldData object for a specific field.
bool FieldExists(IPropertyInfo propertyInfo)
Returns a value indicating whether an IFieldData entry exists for the specified property.
List< object > GetChildren()
Returns a list of all child objects contained in the list of fields.
IPropertyInfo GetRegisteredProperty(string propertyName)
Returns the IPropertyInfo object corresponding to the property name.
Provides information about the DataPortal call.
Maintains metadata about a method.
MethodInfo(string name)
Creates an instance of the object.
A strongly-typed resource class, for looking up localized strings, etc.
static string CreateNotSupportedException
Looks up a localized string similar to Invalid operation - create not allowed.
static string PrivateFieldException
Looks up a localized string similar to Properties with private backing fields must be marked as Relat...
static string DeleteNotSupportedException
Looks up a localized string similar to Invalid operation - delete not allowed.
static string PropertyGetNotAllowed
Looks up a localized string similar to Property get not allowed.
static string UpdateNotSupportedException
Looks up a localized string similar to Invalid operation - update not allowed.
static string BusyObjectsMayNotBeMarkedBusy
Looks up a localized string similar to Objects that are marked busy may not be marked busy again.
static string NoSuchMethod
Looks up a localized string similar to No such method {0}.
Maintains metadata about a property.
virtual T DefaultValue
Gets the default initial value for the property.
string Name
Gets the property name value.
Exception indicating a failure to set a property's field.
This is a base class from which readonly business classes can be derived.
virtual bool IsSelfBusy
Gets a value indicating whether this object is running an async operation.
virtual void Child_OnDataPortalInvoke(DataPortalEventArgs e)
Called by the server-side DataPortal prior to calling the requested DataPortal_XYZ method.
virtual void Child_OnDataPortalInvokeComplete(DataPortalEventArgs e)
Called by the server-side DataPortal after calling the requested DataPortal_XYZ method.
static Csla.Core.IMemberInfo RegisterMethod(Type objectType, IMemberInfo info)
Indicates that the specified method belongs to the type.
static PropertyInfo< P > RegisterProperty< P >(Type objectType, PropertyInfo< P > info)
Indicates that the specified property belongs to the type.
virtual void OnBusyChanged(BusyChangedEventArgs args)
Raises the BusyChanged event.
virtual void Initialize()
Override this method to set up event handlers so user code in a partial class can respond to events r...
virtual void DataPortal_OnDataPortalInvoke(DataPortalEventArgs e)
Called by the server-side DataPortal prior to calling the requested DataPortal_xyz method.
virtual bool CanExecuteMethod(string methodName)
Returns true if the user is allowed to execute the specified method.
virtual bool CanReadProperty(Csla.Core.IPropertyInfo property)
Returns true if the user is allowed to read the calling property.
virtual void Child_OnDataPortalException(DataPortalEventArgs e, Exception ex)
Called by the server-side DataPortal if an exception occurs during data access.
void LoadPropertyAsync< R >(PropertyInfo< R > property, Task< R > factory)
Load a property from an async method.
void MarkBusy()
Marks the object as being busy (it is running an async operation).
virtual object GetClone()
Creates a clone of the object.
virtual void LoadProperty(IPropertyInfo propertyInfo, object newValue)
Loads a property's managed field with the supplied value calling PropertyHasChanged if the value does...
void OnBusyChanged(string propertyName, bool busy)
Raises the BusyChanged event.
bool CanReadProperty(Csla.Core.IPropertyInfo property, bool throwOnFalse)
Returns true if the user is allowed to read the calling property.
virtual object ReadProperty(IPropertyInfo propertyInfo)
Gets a property's value as a specified type.
virtual void DataPortal_OnDataPortalException(DataPortalEventArgs e, Exception ex)
Called by the server-side DataPortal if an exception occurs during data access.
override void OnSetChildren(Csla.Serialization.Mobile.SerializationInfo info, Csla.Serialization.Mobile.MobileFormatter formatter)
Override this method to retrieve your child object references from the MobileFormatter serialzation s...
void LoadPropertyConvert< P, F >(PropertyInfo< P > propertyInfo, F newValue)
Loads a property's managed field with the supplied value calling PropertyHasChanged if the value does...
override string ToString()
Returns a text representation of this object by returning the GetIdValue value in text form.
P LazyGetProperty< P >(PropertyInfo< P > property, Func< P > valueGenerator)
Lazily initializes a property and returns the resulting value.
static MethodInfo RegisterMethod(Type objectType, string methodName)
Indicates that the specified method belongs to the type.
bool CanExecuteMethod(Csla.Core.IMemberInfo method, bool throwOnFalse)
Returns true if the user is allowed to execute the specified method.
P ReadPropertyConvert< F, P >(PropertyInfo< F > propertyInfo)
Gets a property's value from the list of managed field values, converting the value to an appropriate...
static MethodInfo RegisterMethod(Expression< Action< T > > methodLambdaExpression)
Registers the method.
P LazyReadProperty< P >(PropertyInfo< P > property, Func< P > valueGenerator)
Gets a property's value as a specified type.
BusyChangedEventHandler BusyChanged
Event raised when the IsBusy property value has changed.
object GetProperty(IPropertyInfo propertyInfo)
Gets a property's value as a specified type.
BusinessRules BusinessRules
Provides access to the broken rules functionality.
bool CanReadProperty(string propertyName)
Returns true if the user is allowed to read the specified property.
override void OnGetChildren(Csla.Serialization.Mobile.SerializationInfo info, Csla.Serialization.Mobile.MobileFormatter formatter)
Override this method to insert your child object references into the MobileFormatter serialzation str...
virtual bool CanExecuteMethod(Csla.Core.IMemberInfo method)
Returns true if the user is allowed to execute the specified method.
void MarkIdle()
Marks the object as being not busy (it is not running an async operation).
P LazyReadPropertyAsync< P >(PropertyInfo< P > property, Task< P > factory)
Gets a property's value as a specified type.
virtual object GetIdValue()
Override this method to return a unique identifying value for this object.
virtual void OnUnhandledAsyncException(ErrorEventArgs error)
Raises the UnhandledAsyncException event.
P GetPropertyConvert< F, P >(PropertyInfo< F > propertyInfo, F field)
Gets a property's value as a specified type, first checking authorization.
void OnUnhandledAsyncException(object originalSender, Exception error)
Raises the UnhandledAsyncException event.
P ReadProperty< P >(PropertyInfo< P > propertyInfo)
Gets a property's value as a specified type.
EventHandler< ErrorEventArgs > UnhandledAsyncException
Event raised when an exception occurs on a background thread during an asynchronous operation.
virtual bool IsBusy
Gets a value indicating whether this object or any of its child objects are running an async operatio...
T Clone()
Creates a clone of the object.
FieldDataManager FieldManager
Gets the PropertyManager object for this business object.
virtual void DataPortal_OnDataPortalInvokeComplete(DataPortalEventArgs e)
Called by the server-side DataPortal after calling the requested DataPortal_xyz method.
static MethodInfo RegisterMethod(string methodName)
Registers a method for use in Authorization.
P LazyGetPropertyAsync< P >(PropertyInfo< P > property, Task< P > factory)
Lazily initializes a property and returns the resulting value.
virtual void OnDeserialized(System.Runtime.Serialization.StreamingContext context)
This method is called on a newly deserialized object after deserialization is complete.
P GetProperty< P >(string propertyName, P field, P defaultValue)
Gets a property's value, first checking authorization.
ReadOnlyBase()
Creates an instance of the object.
virtual void AddBusinessRules()
Override this method to add per-type authorization rules for your type's properties.
Manages the list of rules for a business type.
Tracks the business rules for a business object.
static bool HasPermission(AuthorizationActions action, Type objectType)
Checks per-type authorization rules.
Object containing the serialization data for a specific object.
Defines the members required by a field data storage object.
object Value
Gets or sets the field value.
This is the core interface implemented by all CSLA .NET base classes.
int Identity
Gets a value representing this object instance's unique identity value within the business object gra...
Maintains metadata about a method or property.
string Name
Gets the member name value.
Interface defining an object that notifies when it is busy executing an asynchronous operation.
Maintains metadata about a property.
RelationshipTypes RelationshipType
Gets the relationship between the declaring object and the object reference in the property.
Type Type
Gets the type of the property.
object DefaultValue
Gets the default initial value for the property.
Specifies that the object is a readonly business object.
This is a base class from which readonly business classes can be derived.
Defines the interaction between the rules engine and a business object that hosts the rules.
void RuleComplete(Csla.Core.IPropertyInfo property)
Indicates that a rule has finished processing.
void RuleStart(Csla.Core.IPropertyInfo property)
Indicates that a rule has started processing.
Defines the authorization interface through which an object can indicate which properties the current...
bool CanWriteProperty(string propertyName)
Returns true if the user is allowed to write the to the specified property.
Interface defining callback methods used by the SerializationFormatterFactory.GetFormatter().
void Deserialized()
Method called on an object after deserialization is complete.
delegate void BusyChangedEventHandler(object sender, BusyChangedEventArgs e)
Delegate for handling the BusyChanged event.
AuthorizationActions
Authorization actions.
RelationshipTypes
List of valid relationship types between a parent object and another object through a managed propert...
@ Serializable
Prevents updating or inserting until the transaction is complete.
@ Delete
Delete operation.