9using System.ComponentModel;
19using TestClass = NUnit.Framework.TestFixtureAttribute;
20using TestInitialize = NUnit.Framework.SetUpAttribute;
21using TestCleanup = NUnit.Framework.TearDownAttribute;
22using TestMethod = NUnit.Framework.TestAttribute;
24using Microsoft.VisualStudio.TestTools.UnitTesting;
41 _testDIContext = TestDIContextFactory.CreateDefaultContext();
68 Assert.AreEqual(
"a", root.Data);
69 Assert.AreEqual(
"b", root.Base);
70 Assert.AreEqual(
"c", root.TopBase);
80 Assert.AreEqual(
string.Empty, root.FieldBackedString,
"FieldBackedString should be empty");
82 Assert.AreEqual(
string.Empty, root.F06,
"F06 should be empty");
83 root.ManagedStringField =
null;
84 Assert.AreEqual(
string.Empty, root.ManagedStringField,
"ManagedStringField should be empty");
86 Assert.AreEqual(
string.Empty, root.M07,
"M07 should be empty");
96 Assert.AreEqual(123, root.M02);
98 root.LoadInternalAndPrivate(
"Test");
99 Assert.AreEqual(
"Test", root.M08);
102 var cmd = commandDataPortal.
Create();
104 Assert.AreEqual(
"abc", cmd.Name);
107 var ro = roDataPortal.
Fetch();
109 Assert.AreEqual(
"abc", ro.Name);
118 root.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
119 root.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
120 Assert.AreEqual(
"n/a", root.F03,
"Default value should have been set");
121 Assert.AreEqual(
"", root.FieldBackedString,
"String should default to string.Empty");
122 Assert.AreEqual(0, root.F02,
"Numeric should default to 0");
123 Assert.AreEqual(
false, root.F05,
"bool should default to false");
125 root.FieldBackedString =
"hi there";
126 Assert.AreEqual(
"hi there", root.FieldBackedString,
"String should have been set");
128 Assert.AreEqual(
"FieldBackedString", _changingName,
"FieldBackedString should have been changing");
130 Assert.AreEqual(
"FieldBackedString", _changedName,
"FieldBackedString should have changed");
133 Assert.AreEqual(123, root.F02,
"Numeric should have been set");
136 Assert.AreEqual(
true, root.F05,
"bool should have been set");
138 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
140 root.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
141 root.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
151 Assert.AreEqual(
"n/a", root.F03,
"Default value should have been set");
152 Assert.AreEqual(
"", root.FieldBackedString,
"String should default to string.Empty");
153 Assert.AreEqual(0, root.F02,
"Numeric should default to 0");
157 Assert.AreEqual(
"hi there", root.FieldBackedString,
"String should have been set");
160 Assert.AreEqual(123, root.F02,
"Numeric should have been set");
162 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
171 root.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
172 root.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
173 Assert.AreEqual(
"n/a", root.M03,
"Default value should have been set");
174 Assert.AreEqual(
"", root.ManagedStringField,
"String should default to string.Empty");
175 Assert.AreEqual(0, root.M02,
"Numeric should default to 0");
176 Assert.AreEqual(
false, root.M05,
"bool should default to false");
178 root.ManagedStringField =
"hi there";
179 Assert.AreEqual(
"hi there", root.ManagedStringField,
"String should have been set");
180 Assert.AreEqual(
"ManagedStringField", _changingName,
"ManagedStringField should have been changing");
181 Assert.AreEqual(
"ManagedStringField", _changedName,
"ManagedStringField should have changed");
183 _changedName =
string.Empty;
184 _changingName =
string.Empty;
186 root.ManagedStringField =
"hi there";
187 Assert.AreEqual(
"hi there", root.ManagedStringField,
"String should be the same");
188 Assert.AreEqual(
string.Empty, _changingName,
"ManagedStringField should not have been changing");
190 Assert.AreEqual(
string.Empty, _changedName,
"ManagedStringField should not have changed");
193 Assert.AreEqual(123, root.M02,
"Numeric should have been set");
195 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
197 root.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
199 root.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
209 root.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
211 root.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
212 Assert.AreEqual(
"", root.Base,
"String should default to string.Empty");
213 Assert.AreEqual(
"", root.TopBase,
"TopBase should default to string.Empty");
215 root.Base =
"hi there";
216 Assert.AreEqual(
"hi there", root.Base,
"String should have been set");
218 Assert.AreEqual(
"Base", _changingName,
"Base should have been changing");
220 Assert.AreEqual(
"Base", _changedName,
"Base should have changed");
222 root.TopBase =
"hi there";
223 Assert.AreEqual(
"hi there", root.TopBase,
"TopBase should have been set");
225 Assert.AreEqual(
"TopBase", _changingName,
"TopBase should have been changing");
227 Assert.AreEqual(
"TopBase", _changedName,
"TopBase should have changed");
230 Assert.AreEqual(
true, root.M05,
"bool should have been set");
233 root.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
235 root.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
245 Assert.AreEqual(
"n/a", root.M03,
"Default value should have been set");
246 Assert.AreEqual(
"", root.ManagedStringField,
"String should default to string.Empty");
247 Assert.AreEqual(0, root.M02,
"Numeric should default to 0");
251 Assert.AreEqual(
"hi there", root.ManagedStringField,
"String should have been set");
255 Assert.AreEqual(123, root.M02,
"Numeric should have been set");
257 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
268 root.FieldBackedString =
"hi there";
269 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
273 Assert.IsFalse(root.IsDirty,
"Root should not be dirty");
282 Assert.AreEqual(
"", root.F04,
"Field should default to string.Empty");
283 Assert.AreEqual(
"", root.M04,
"Should default to string.Empty");
285 root.
F04 =
new DateTime(1998, 12, 21).ToShortDateString();
286 Assert.AreEqual(
new DateTime(1998, 12, 21).ToShortDateString(), root.F04,
"Field SmartDate should have been set");
288 root.M04 =
new DateTime(1998,12,21).ToShortDateString();
289 Assert.AreEqual(
new DateTime(1998, 12, 21).ToShortDateString(), root.M04,
"SmartDate should have been set");
291 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
301 root.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
303 root.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
306 Assert.IsNotNull(child,
"Child should not be null");
308 Assert.AreEqual(
"ManagedChild", _changingName,
"ManagedChild should have been changing");
310 Assert.AreEqual(
"ManagedChild", _changedName,
"ManagedChild should have changed");
316 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
317 Assert.IsTrue(child.IsDirty,
"Child should be dirty");
320 child.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
322 child.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
325 Assert.AreEqual(
"FieldBackedString", _changingName,
"ManagedChild should NOT have been changing");
326 Assert.AreEqual(
false, (
"ManagedChild" == _changedName),
"ManagedChild should have changed");
329 root.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
330 child.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
332 root.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
333 child.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
347 root.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
349 root.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
352 Assert.IsNotNull(child,
"Child should not be null");
353 Assert.AreEqual(
"hi there", child.
FieldBackedString,
"Child value should be intact");
355 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
356 Assert.IsTrue(child.IsDirty,
"Child should be dirty");
360 child.PropertyChanging +=
new PropertyChangingEventHandler(root_PropertyChanging);
363 child.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
366 Assert.AreEqual(
"FieldBackedString", _changingName,
"ManagedChild should NOT have been changing");
367 Assert.AreEqual(
false, (
"ManagedChild" == _changedName),
"ManagedChild should have changed");
371 child.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
372 root.PropertyChanging -=
new PropertyChangingEventHandler(root_PropertyChanging);
374 child.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
375 root.PropertyChanged -=
new System.ComponentModel.PropertyChangedEventHandler(root_PropertyChanged);
385 Assert.IsFalse(root.IsDirty,
"Root should not start dirty");
387 Assert.AreEqual(
"", root.FieldBackedString,
"Explicit String should default to string.Empty");
388 Assert.AreEqual(
"", root.ManagedStringField,
"Managed String should default to string.Empty");
390 Assert.IsFalse(root.IsDirty,
"Root should not be dirty after defaults load");
394 root.ManagedStringField =
"ManagedStringField";
395 Assert.AreEqual(
"fieldBackedString", root.FieldBackedString,
"String should be fieldBackedString");
396 Assert.AreEqual(
"ManagedStringField", root.ManagedStringField,
"String should be ManagedStringField");
398 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
401 Assert.AreEqual(
"", root.FieldBackedString,
"Explicit String should revert to string.Empty");
402 Assert.AreEqual(
"", root.ManagedStringField,
"Managed String should revert to string.Empty");
404 Assert.IsFalse(root.IsDirty,
"Root should not be dirty");
408 [TestCategory(
"SkipWhenLiveUnitTesting")]
415 Assert.IsFalse(root.IsDirty,
"Root should not start dirty");
417 Assert.AreEqual(
"", root.FieldBackedString,
"Explicit String should default to string.Empty");
418 Assert.AreEqual(
"", root.ManagedStringField,
"Managed String should default to string.Empty");
420 Assert.IsFalse(root.IsDirty,
"Root should not be dirty after defaults load");
424 root.ManagedStringField =
"ManagedStringField";
425 Assert.AreEqual(
"fieldBackedString", root.FieldBackedString,
"String should be fieldBackedString");
426 Assert.AreEqual(
"ManagedStringField", root.ManagedStringField,
"String should be ManagedStringField");
428 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
431 Assert.AreEqual(
"fieldBackedString", root.FieldBackedString,
"String should be fieldBackedString after apply");
432 Assert.AreEqual(
"ManagedStringField", root.ManagedStringField,
"String should be ManagedStringField after apply");
434 Assert.IsTrue(root.IsDirty,
"Root should be dirty after ApplyEdit");
435 Assert.IsTrue(root.IsValid,
"Root should be valid (no validation rules exist)");
439 Assert.IsFalse(root.IsDirty,
"Root should not be dirty after Save");
448 Assert.AreEqual(0, root.EditLevel,
"Root edit level before BeginEdit");
450 Assert.AreEqual(1, root.EditLevel,
"Root edit level after BeginEdit");
453 Assert.AreEqual(1, initialChild.
EditLevel,
"Child edit level after being created");
455 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
458 Assert.AreEqual(0, root.EditLevel,
"Root edit level after CancelEdit");
460 Assert.AreEqual(0, secondChild.
EditLevel,
"Second child edit level after being created");
461 Assert.IsFalse(ReferenceEquals(initialChild, secondChild),
"Child objects should be different");
463 Assert.IsTrue(root.IsDirty,
"Root should be dirty after second child created");
473 Assert.AreEqual(0, root.EditLevel,
"Root edit level before BeginEdit");
475 Assert.AreEqual(1, root.EditLevel,
"Root edit level after BeginEdit");
476 Assert.AreEqual(1, root.ManagedChild.EditLevel,
"Child edit level after BeginEdit");
477 Assert.AreEqual(1, root.ManagedChildList.EditLevel,
"List edit level after BeginEdit");
479 Assert.AreEqual(1, root.ManagedChildList[0].EditLevel,
"List child edit level after BeginEdit");
482 Assert.AreEqual(1, root.EditLevel,
"Root edit level after Clone");
483 Assert.AreEqual(1, root.ManagedChild.EditLevel,
"Child edit level after Clone");
484 Assert.AreEqual(1, root.ManagedChildList.EditLevel,
"List edit level after Clone");
485 Assert.AreEqual(1, root.ManagedChildList[0].EditLevel,
"List child edit level after Clone");
487 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
500 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
501 Assert.IsTrue(initialChild.IsDirty,
"Child should be dirty");
506 Assert.IsFalse(root.IsDirty,
"Root should not be dirty");
508 Assert.IsTrue(root.ManagedChild.IsDirty,
"Child should be dirty after lazy loading");
509 Assert.IsTrue(root.IsDirty,
"Root should now be dirty since it lazy loaded ManagedChild");
518 Assert.AreEqual(0, root.EditLevel,
"Root edit level before BeginEdit");
520 Assert.AreEqual(1, root.EditLevel,
"Root edit level after BeginEdit");
523 Assert.AreEqual(1, initialChild.
EditLevel,
"Child edit level after being created");
525 Assert.IsTrue(root.IsDirty,
"Root should be dirty");
528 Assert.AreEqual(0, root.EditLevel,
"Root edit level after ApplyEdit");
530 Assert.AreEqual(0, secondChild.
EditLevel,
"Second child edit level after ApplyEdit");
531 Assert.IsTrue(ReferenceEquals(initialChild, secondChild),
"Child objects should be the same");
533 Assert.IsTrue(root.IsDirty,
"Root should be dirty after ApplyEdit");
537 Assert.IsFalse(root.IsDirty,
"Root should not be dirty after Save");
547 Assert.AreEqual(0, root.EditLevel,
"Root edit level before BeginEdit");
549 Assert.AreEqual(1, root.EditLevel,
"Root edit level after BeginEdit");
552 Assert.AreEqual(1, list.
EditLevel,
"List edit level after being created");
554 Assert.IsFalse(root.IsDirty,
"Root should not be dirty");
555 Assert.IsFalse(list.
IsDirty,
"List should not be dirty");
558 Assert.AreEqual(1, list.Count,
"List count should be 1");
561 Assert.AreEqual(0, root.EditLevel,
"Root edit level after CancelEdit");
562 ChildList secondList = root.ManagedChildList;
563 Assert.AreEqual(0, secondList.
EditLevel,
"Second list edit level after CancelEdit");
564 Assert.IsFalse(ReferenceEquals(list, secondList),
"List objects should not be the same");
566 Assert.IsFalse(root.IsDirty,
"Root should not be dirty after CancelEdit");
567 Assert.IsFalse(secondList.
IsDirty,
"Second list should not be dirty");
571 [TestCategory(
"SkipWhenLiveUnitTesting")]
578 Assert.AreEqual(0, root.EditLevel,
"Root edit level before BeginEdit");
580 Assert.AreEqual(1, root.EditLevel,
"Root edit level after BeginEdit");
583 Assert.AreEqual(1, childList.EditLevel,
"List edit level after being created");
585 Assert.IsFalse(root.IsDirty,
"Root should not be dirty");
586 Assert.IsFalse(childList.IsDirty,
"List should not be dirty");
589 Assert.AreEqual(1, childList.Count,
"List count should be 1");
592 Assert.AreEqual(0, root.EditLevel,
"Root edit level after ApplyEdit");
593 var secondChildList = root.ManagedChildList;
594 Assert.AreEqual(0, secondChildList.EditLevel,
"Second list edit level after ApplyEdit");
595 Assert.IsTrue(ReferenceEquals(childList, secondChildList),
"List objects should be the same");
597 Assert.IsTrue(root.IsDirty,
"Root should be dirty after ApplyEdit");
598 Assert.IsTrue(secondChildList.IsDirty,
"Second list should be dirty");
602 Assert.IsFalse(root.IsDirty,
"Root should not be dirty after Save");
603 Assert.IsFalse(root.ManagedChildList.IsDirty,
"List should not be dirty after Save");
612 Assert.AreEqual(
Guid.Empty, root.M06,
"Guid should be null");
620 [ExpectedException(typeof(InvalidOperationException))]
632 catch (TypeInitializationException ex)
634 throw ex.InnerException;
639 [ExpectedException(typeof(InvalidOperationException))]
649 catch (TypeInitializationException ex)
651 if (ex.InnerException !=
null)
652 throw ex.InnerException;
659 #region Event Bubbling
661 private string _changingName;
662 void root_PropertyChanging(
object sender, PropertyChangingEventArgs e)
664 _changingName = e.PropertyName;
667 private string _changedName;
668 void root_PropertyChanged(
object sender, PropertyChangedEventArgs e)
670 _changedName = e.PropertyName;
679 Assert.IsFalse(root.ManagedStringFieldDirty,
"ManagedStringField should not be dirty");
681 Assert.IsTrue(root.ManagedStringFieldDirty,
"ManagedStringField should be dirty");
690 root.ChildChanged += (o, e) => {
throw new InvalidOperationException(); };
691 root.ManagedStringField =
"test";
701 root.ChildChanged += (o, e) => { changed++; };
702 root.
ManagedChild.ChildChanged += (o, e) => {
throw new InvalidOperationException();};
705 Assert.AreEqual(1, changed);
718 root.ChildChanged += (o, e) => { rootChanged++; };
721 list.ChildChanged += (o, e) => { listChanged++; };
724 list[0].FieldBackedString =
"child change";
726 Assert.AreEqual(4, rootChanged);
727 Assert.AreEqual(1, listChanged);
737 int childListChanged = 0;
738 int grandChildListChanged = 0;
739 int childChanged = 0;
740 int grandChildPropertyChanged = 0;
743 root.PropertyChanged += (o, e) => {
throw new InvalidOperationException(); };
744 root.ChildChanged += (o, e) => { rootChanged++; };
748 child.PropertyChanged += (o, e) => {
throw new InvalidOperationException(); };
749 child.ChildChanged += (o, e) => { childChanged++; };
750 child.ManagedChildList.ChildChanged += (o, e) => { grandChildListChanged++; };
753 grandChild.ChildChanged += (o, e) => {
throw new InvalidOperationException(); };
754 grandChild.PropertyChanged += (o, e) => { grandChildPropertyChanged++; };
757 child.ManagedChildList.Add(grandChild);
758 root.
ManagedChildList[0].ManagedChildList[0].FieldBackedString =
"child change";
760 Assert.AreEqual(7, rootChanged);
761 Assert.AreEqual(4, childChanged);
762 Assert.AreEqual(4, childListChanged);
763 Assert.AreEqual(1, grandChildListChanged);
764 Assert.AreEqual(1, grandChildPropertyChanged);
777 child.ManagedChildList.Add(grandChild);
783 root.ChildChanged += (o, e) => { changed++;};
784 child.FieldBackedString =
"changed";
786 Assert.AreEqual(1, changed);
799 child.ManagedChildList.Add(grandChild);
801 var applicationContext = _testDIContext.CreateTestApplicationContext();
802 MemoryStream stream =
new MemoryStream();
805 stream.Seek(0, SeekOrigin.Begin);
809 root.ChildChanged += (o, e) => { changed++; };
810 root.ManagedChildList[0].ManagedChildList[0].FieldBackedString =
"changed";
811 Assert.AreEqual(1, changed,
"after MobileFormatter");
815 root.ChildChanged += (o, e) => { changed++; };
816 root.ManagedChildList[0].ManagedChildList[0].FieldBackedString =
"changed again";
817 Assert.AreEqual(1, changed,
"after clone");
821 [ExpectedException(typeof(InvalidOperationException))]
838 var child = root.LazyChild;
839 Assert.IsNotNull(child);
861 private void Create()
876 internal string OriginalName
882 private string OriginalNamePrivate
Provides consistent context information between the client and server DataPortal objects.
static PropertyChangedModes PropertyChangedMode
Gets or sets a value specifying how CSLA .NET should raise PropertyChanged events.
PropertyChangedModes
Enum representing the way in which CSLA .NET should raise PropertyChanged events.
bool IsDirty
Gets a value indicating whether this object's data has been changed.
void ApplyEdit()
Commits the current edit process.
void CancelEdit()
Cancels the current edit process, restoring the object's state to its previous values.
void BeginEdit()
Starts a nested edit on the object.
T Clone()
Creates a clone of the object.
This is the base class from which command objects will be derived.
Maintains metadata about a property.
This is a base class from which readonly business classes can be derived.
virtual void LoadProperty(IPropertyInfo propertyInfo, object newValue)
Loads a property's managed field with the supplied value calling PropertyHasChanged if the value does...
virtual object ReadProperty(IPropertyInfo propertyInfo)
Gets a property's value as a specified type.
static BadGetSet GetObject(IDataPortal< BadGetSet > dataPortal)
static BadGetSetTwo GetObject(IDataPortal< BadGetSetTwo > dataPortal)
static ChildList NewObject(IDataPortal< ChildList > dataPortal)
static readonly PropertyInfo< string > NameProperty
static EditableGetSet GetObject(IDataPortal< EditableGetSet > dataPortal)
EditableGetSet ManagedChild
static EditableGetSet NewChildObject(IChildDataPortal< EditableGetSet > childDataPortal)
ChildList ManagedChildList
string ManagedStringField
static EditableGetSetNFI GetObject(IDataPortal< EditableGetSetNFI > dataPortal)
void If_FieldBackedString_Is_Changed_On_GrandChild_List_Item_After_Root_Is_Deserialized_Then_Root_ChildChanged_Event_Fires()
void RootChildUndoApply()
void RootChildUndoCancelIsDirty()
void LazyLoadChild_GetAfterSet()
void If_FieldBackedString_Property_Is_Changed_On_Child_After_CancelEdit_Then_ChildChanged_Fires_On_Root()
void SerializedEditLevel()
void If_ManagedStringField_Property_Changes_ChildChanged_Event_Should_Not_Fire()
void SerializedManagedFieldProperties()
void SerializedExplicitFieldProperties()
void ManagedFieldProperties()
void ManagedFieldBaseProperties()
void PropertyNotRegistered()
void If_FieldBackedString_Property_Changes_On_Item_In_ManagedChildList_Then_ChildChanged_Fires_On_Root_And_On_ManagedChildList()
void PropertyRegisteredTwice()
void If_FieldBackedString_Property_Changes_On_ManagedChild_Then_ChildChanged_Should_Fire_On_Root_ButNot_On_ManagedChild()
void SerializedSimpleChildProperties()
void SimpleChildProperties_LazyLoadedChild()
void RootChildListUndoApply()
void If_FieldBackedString_Changes_On_GrandChild_Then_ChildChanged_Fires_On_GrandChild_Child_and_Root()
void RootChildListUndoCancel()
void LazyLoadChild_GetBeforeSet()
void RootChildUndoCancel()
void NonGenericLoadProperty()
void ExplicitFieldProperties()
static void ClassInitialize(TestContext context)
void SmartDateProperties()
static readonly PropertyInfo< string > NameProperty
static readonly PropertyInfo< string > _originalNameProperty
static readonly PropertyInfo< string > _originalNamePrivateProperty
Type to carry context information for DI in unit tests
Maintains metadata about a property.
Interface defining the members of the child data portal type.
Interface defining the members of the data portal type.
object Fetch(params object[] criteria)
Called by a factory method in a business class to retrieve an object, which is loaded with values fro...
object Create(params object[] criteria)
Called by a factory method in a business class to create a new object, which is loaded with default v...
@ Guid
Globally unique identifier / Guid
@ Serializable
Prevents updating or inserting until the transaction is complete.