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;
56 #region Object ID Value
69 #region System.Object Overrides
80 return base.ToString();
98 InitializeBusinessRules();
130 #region Authorization
134 private ConcurrentDictionary<string, bool> _readResultCache;
137 private ConcurrentDictionary<string, bool> _executeResultCache;
140 private System.Security.Principal.IPrincipal _lastPrincipal;
142 private void InitializeBusinessRules()
145 if (!rules.Initialized)
147 if (!rules.Initialized)
152 rules.Initialized =
true;
176 if (_businessRules ==
null)
178 else if (_businessRules.Target ==
null)
179 _businessRules.SetTarget(
this);
180 return _businessRules;
195 void Rules.IHostRules.AllRulesComplete()
215 [EditorBrowsable(EditorBrowsableState.Advanced)]
220 VerifyAuthorizationCache();
222 if (!_readResultCache.TryGetValue(property.Name, out result))
226 _readResultCache.AddOrUpdate(property.Name, result, (a, b) => { return result; });
239 [EditorBrowsable(EditorBrowsableState.Advanced)]
243 if (throwOnFalse && result ==
false)
246 String.Format(
"{0} ({1})",
258 [EditorBrowsable(EditorBrowsableState.Advanced)]
274 if (propertyInfo ==
null)
276#if NETFX_CORE || (ANDROID || IOS)
278 Trace.TraceError(
"CanReadProperty: {0} is not a registered property of {1}.{2}", propertyName, this.GetType().Namespace, this.GetType().Name);
295 private void VerifyAuthorizationCache()
297 if (_readResultCache ==
null)
298 _readResultCache =
new ConcurrentDictionary<string, bool>();
299 if (_executeResultCache ==
null)
300 _executeResultCache =
new ConcurrentDictionary<string, bool>();
304 _readResultCache.Clear();
305 _executeResultCache.Clear();
316 [EditorBrowsable(EditorBrowsableState.Advanced)]
321 VerifyAuthorizationCache();
323 if (!_executeResultCache.TryGetValue(method.Name, out result))
326 _executeResultCache.AddOrUpdate(method.Name, result, (a, b) => { return result; });
339 [EditorBrowsable(EditorBrowsableState.Advanced)]
344 if (throwOnFalse && result ==
false)
361 [EditorBrowsable(EditorBrowsableState.Advanced)]
371 if (throwOnFalse && result ==
false)
383 object ICloneable.Clone()
392 [EditorBrowsable(EditorBrowsableState.Advanced)]
412 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Usage",
"CA1801:ReviewUnusedParameters", MessageId =
"criteria")]
413 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1822:MarkMembersAsStatic")]
414 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
415 private void DataPortal_Create(
object criteria)
420 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1822:MarkMembersAsStatic")]
421 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
422 private void DataPortal_Update()
427 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Usage",
"CA1801:ReviewUnusedParameters", MessageId =
"criteria")]
428 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1822:MarkMembersAsStatic")]
429 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Performance",
"CA1811:AvoidUncalledPrivateCode")]
431 private void DataPortal_Delete(
object criteria)
441 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
442 [EditorBrowsable(EditorBrowsableState.Advanced)]
453 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
454 [EditorBrowsable(EditorBrowsableState.Advanced)]
466 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
467 [EditorBrowsable(EditorBrowsableState.Advanced)]
478 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
479 [EditorBrowsable(EditorBrowsableState.Advanced)]
489 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
490 [EditorBrowsable(EditorBrowsableState.Advanced)]
501 [System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Naming",
"CA1707:IdentifiersShouldNotContainUnderscores", MessageId =
"Member")]
502 [EditorBrowsable(EditorBrowsableState.Advanced)]
509#region Serialization Notification
513 OnDeserializedHandler(
new System.Runtime.Serialization.StreamingContext());
516 [System.Runtime.Serialization.OnDeserialized()]
517 private void OnDeserializedHandler(System.Runtime.Serialization.StreamingContext context)
519 if (_fieldManager !=
null)
521 InitializeBusinessRules();
530 [EditorBrowsable(EditorBrowsableState.Advanced)]
531 protected virtual void OnDeserialized(System.Runtime.Serialization.StreamingContext context)
539#region Register Properties
559 return Core.FieldManager.PropertyInfoManager.RegisterProperty<P>(objectType, info);
577 return Core.FieldManager.PropertyInfoManager.RegisterProperty<P>(typeof(T), info);
601 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
628 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
657 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
684 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
715 PropertyInfo reflectedPropertyInfo = Reflect<T>.GetProperty(propertyLambdaExpression);
720 #region Register Methods
737 var reflected = objectType.GetMethod(info.
Name);
738 if (reflected ==
null)
780 System.Reflection.
MethodInfo reflectedMethodInfo = Reflect<T>.GetMethod(methodLambdaExpression);
786#region Get Properties
808 return GetProperty<P>(propertyName, field, defaultValue, Security.NoAccessBehavior.SuppressException);
827 protected P
GetProperty<P>(
string propertyName, P field, P defaultValue, Security.NoAccessBehavior noAccess)
829#region Check to see if the property is marked with RelationshipTypes.PrivateField
902 var result = valueGenerator();
916 return LoadManager.IsLoadingProperty(propertyInfo);
943 LoadPropertyAsync(property, factory);
969 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo.
Name, field, propertyInfo.
DefaultValue, Security.NoAccessBehavior.SuppressException));
996 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo.
Name, field, propertyInfo.
DefaultValue, noAccess));
1015 return GetProperty<P>(propertyInfo, Security.NoAccessBehavior.SuppressException);
1038 return Utilities.CoerceValue<P>(typeof(F),
null, GetProperty<F>(propertyInfo, Security.NoAccessBehavior.SuppressException));
1064 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));
1165 P result =
default(P);
1173 result = (P)data.
Value;
1192 return MethodCaller.CallPropertyGetter(
this, propertyInfo.
Name);
1195 object result =
null;
1199 result = info.
Value;
1222 var result = valueGenerator();
1241 LoadPropertyAsync(property, factory);
1246 P IManageProperties.LazyReadProperty<P>(
PropertyInfo<P> propertyInfo, Func<P> valueGenerator)
1248 return LazyReadProperty(propertyInfo, valueGenerator);
1251 P IManageProperties.LazyReadPropertyAsync<P>(PropertyInfo<P> propertyInfo, Task<P> factory)
1253 return LazyReadPropertyAsync(propertyInfo, factory);
1258#region Load Properties
1279 P oldValue =
default(P);
1281 if (fieldData ==
null)
1284 fieldData =
FieldManager.LoadFieldData(propertyInfo, oldValue);
1288 oldValue = (P)fieldData.
Value;
1291 if (oldValue ==
null)
1293 if (newValue !=
null)
1294 FieldManager.LoadFieldData(propertyInfo, Utilities.CoerceValue<P>(typeof(F), oldValue, newValue));
1296 else if (!(oldValue.Equals(newValue)))
1298 FieldManager.LoadFieldData(propertyInfo, Utilities.CoerceValue<P>(typeof(F), oldValue, newValue));
1301 catch (Exception ex)
1303 throw new PropertyLoadException(
string.Format(Properties.Resources.PropertyLoadException, propertyInfo.
Name, ex.Message));
1307 void Core.IManageProperties.LoadProperty<P>(
PropertyInfo<P> propertyInfo, P newValue)
1309 LoadProperty<P>(propertyInfo, newValue);
1312 bool Core.IManageProperties.FieldExists(Core.IPropertyInfo property)
1339 P oldValue =
default(P);
1341 if (fieldData ==
null)
1344 fieldData =
FieldManager.LoadFieldData(propertyInfo, oldValue);
1348 oldValue = (P)fieldData.
Value;
1351 if (oldValue ==
null)
1353 if (newValue !=
null)
1356 else if (!(oldValue.Equals(newValue)))
1361 catch (Exception ex)
1363 throw new PropertyLoadException(
string.Format(Properties.Resources.PropertyLoadException, propertyInfo.
Name, ex.Message));
1384 var t = this.GetType();
1385 var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
1386 var method = t.GetMethods(flags).Where(c => c.Name ==
"LoadProperty" && c.IsGenericMethod).FirstOrDefault();
1387 var gm = method.MakeGenericMethod(propertyInfo.
Type);
1388 var p =
new object[] { propertyInfo, newValue };
1394 private AsyncLoadManager _loadManager;
1395 internal AsyncLoadManager LoadManager
1399 if (_loadManager ==
null)
1402 _loadManager.BusyChanged += loadManager_BusyChanged;
1403 _loadManager.UnhandledAsyncException += loadManager_UnhandledAsyncException;
1405 return _loadManager;
1453 LoadManager.BeginLoad(
new TaskLoader<R>(property, factory));
1457#region Field Manager
1470 if (_fieldManager ==
null)
1474 return _fieldManager;
1482#region IsBusy / IsIdle
1486 private bool _isBusy;
1492 [EditorBrowsable(EditorBrowsableState.Advanced)]
1506 [EditorBrowsable(EditorBrowsableState.Advanced)]
1519 [Display(AutoGenerateField =
false)]
1520 [ScaffoldColumn(
false)]
1532 [Display(AutoGenerateField =
false)]
1533 [ScaffoldColumn(
false)]
1536 get {
return _isBusy || LoadManager.IsLoading; }
1564 [EditorBrowsable(EditorBrowsableState.Advanced)]
1574 [EditorBrowsable(EditorBrowsableState.Advanced)]
1577 if (_propertyBusy !=
null)
1578 _propertyBusy(
this, args);
1583#region IDataPortalTarget Members
1629#region IManageProperties Members
1631 bool IManageProperties.HasManagedProperties
1633 get {
return (_fieldManager !=
null && _fieldManager.
HasFields); }
1636 List<IPropertyInfo> IManageProperties.GetManagedProperties()
1641 object IManageProperties.GetProperty(
IPropertyInfo propertyInfo)
1646 object IManageProperties.LazyGetProperty<P>(PropertyInfo<P> propertyInfo, Func<P> valueGenerator)
1648 return LazyGetProperty(propertyInfo, valueGenerator);
1651 object IManageProperties.LazyGetPropertyAsync<P>(PropertyInfo<P> propertyInfo, Task<P> factory)
1653 return LazyGetPropertyAsync(propertyInfo, factory);
1656 object IManageProperties.ReadProperty(
IPropertyInfo propertyInfo)
1661 P IManageProperties.ReadProperty<P>(PropertyInfo<P> propertyInfo)
1666 void IManageProperties.SetProperty(
IPropertyInfo propertyInfo,
object newValue)
1668 throw new NotImplementedException(
"IManageProperties.SetProperty");
1671 void IManageProperties.LoadProperty(
IPropertyInfo propertyInfo,
object newValue)
1676 bool IManageProperties.LoadPropertyMarkDirty(
IPropertyInfo propertyInfo,
object newValue)
1682 List<object> IManageProperties.GetChildren()
1688#region MobileFormatter
1704 base.OnGetChildren(info, formatter);
1705 if (_fieldManager !=
null)
1707 var fieldManagerInfo = formatter.SerializeObject(_fieldManager);
1708 info.AddChild(
"_fieldManager", fieldManagerInfo.ReferenceId);
1725 if (info.Children.ContainsKey(
"_fieldManager"))
1727 var childData = info.Children[
"_fieldManager"];
1728 _fieldManager = (
FieldDataManager)formatter.GetObject(childData.ReferenceId);
1735#region INotifyUnhandledAsyncException Members
1747 add { _unhandledAsyncException = (EventHandler<
Csla.
Core.
ErrorEventArgs>)Delegate.Combine(_unhandledAsyncException, value); }
1748 remove { _unhandledAsyncException = (EventHandler<
Csla.
Core.
ErrorEventArgs>)Delegate.Remove(_unhandledAsyncException, value); }
1755 [EditorBrowsable(EditorBrowsableState.Advanced)]
1758 if (_unhandledAsyncException !=
null)
1759 _unhandledAsyncException(
this, error);
1768 [EditorBrowsable(EditorBrowsableState.Advanced)]
Provides consistent context information between the client and server DataPortal objects.
object CreateInstanceDI(Type objectType, params object[] parameters)
Creates an object using 'Activator.CreateInstance' using service provider (if one is available) to po...
IPrincipal User
Get or set the current IPrincipal object representing the user's identity.
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 type.
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.
RelationshipTypes RelationshipType
Gets the relationship between the declaring object and the object reference in 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...
EventHandler< Csla.Core.ErrorEventArgs > UnhandledAsyncException
Event raised when an exception occurs on a background thread during an asynchronous operation.
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...
virtual void OnUnhandledAsyncException(Csla.Core.ErrorEventArgs error)
Raises the UnhandledAsyncException event.
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.
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.
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.
ApplicationContext ApplicationContext
Gets or sets the current ApplicationContext object.
bool PropertyIsLoading(IPropertyInfo propertyInfo)
Gets a value indicating whether a lazy loaded property is currently being retrieved.
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 type.
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.
BusinessRules()
Creates an instance of the type.
static bool HasPermission(ApplicationContext applicationContext, 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.
Implement if a class requires access to the CSLA ApplicationContext type.
ApplicationContext ApplicationContext
Gets or sets the current ApplicationContext 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.