Commits

Douglas Aguiar committed 6b34e21

Adicionando app de exemplo.

Comments (0)

Files changed (185)

AssemblyVersion.cs

 using System.Reflection;
 
-[assembly: AssemblyVersion("1.3.0.2")]
-[assembly: AssemblyFileVersion("1.3.0.2")]
-[assembly: AssemblyInformationalVersion("1.3.0.2")]
+[assembly: AssemblyVersion("1.4.0.0")]
+[assembly: AssemblyFileVersion("1.4.0.0")]
+[assembly: AssemblyInformationalVersion("1.4.0.0")]

LiteFx.NHibernate/NHibernateContextAdapter.cs

 	/// NHibernate base context.
 	/// </summary>
 	/// <typeparam name="TId"></typeparam>
-	public abstract class NHibernateContextAdapter<TId> : IContext<TId>, IDisposable
+	public abstract class NHibernateContextAdapter<TId> : IContext<TId>
 		where TId : IEquatable<TId>
 	{
 		/// <summary>
 			}
 		}
 
-		#region IContext Members
 		/// <summary>
 		/// Get a queryable object of an especifique entity.
 		/// </summary>
 		{
 			SessionFactoryManager.Current.CommitTransaction();
 		}
-		#endregion
-
-		#region IDisposable Members [Dispose pattern implementation]
-
-		/// <summary>
-		/// Implementação do Dipose Pattern.
-		/// </summary>
-		/// <remarks><a target="blank" href="http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx">Dispose Pattern</a>.</remarks>
-		private bool disposed;
-
-		/// <summary>
-		/// Libera todos os recursos utilizados pela classe.
-		/// Implementação do Dispose Pattern.
-		/// </summary>
-		/// <remarks><a target="blank" href="http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx">Dispose Pattern</a>.</remarks>
-		/// <param name="disposing">Usado para verificar se a chamada esta sendo feita pelo <see cref="GC"/> ou pela aplicação.</param>
-		protected virtual void Dispose(bool disposing)
-		{
-			if (disposed) return;
-
-			if (disposing)
-			{
-				if (CurrentSession != null)
-					CurrentSession.Dispose();
-			}
-
-			disposed = true;
-		}
-
-		/// <summary>
-		/// Chamado pelo <see ref="GC" /> para liberar recursos que não estão sendo utilizados.
-		/// Implementação do Dipose Pattern.
-		/// </summary>
-		/// <remarks><a target="blank" href="http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx">Dispose Pattern</a>.</remarks>
-		~NHibernateContextAdapter()
-		{
-			Dispose(false);
-		}
-
-		/// <summary>
-		/// Libera todos os recursos utilizados pela classe.
-		/// Implementação do Dipose Pattern.
-		/// </summary>
-		/// <remarks><a target="blank" href="http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx">Dispose Pattern</a>.</remarks>
-		public void Dispose()
-		{
-			Dispose(true);
-			GC.SuppressFinalize(this);
-		}
-		#endregion
 	}
 }

LiteFx.Specs/EntitySpecs/EntitiesEquality.feature

 	When I compare the two instances
 	Then the equality should be true
 
+Scenario: Differentiate two entities of the same type and id
+	Given I have a product instance with the id 5
+	And I have another product instance with the id 5
+	When I check the diference of the two instances
+	Then the diference should be false
+
 Scenario: Comparing two entities of the same type and diferent id
 	Given I have a product instance with the id 5
 	And I have another product instance with the id 10
 	When I compare the two instances
 	Then the equality should be false
 
+Scenario: Comparing two entities of the same type and id equals 0
+	Given I have a product instance with the id 0
+	And I have another product instance with the id 0
+	When I compare the two instances
+	Then the equality should be false
+	
+Scenario: Comparing two entities variables of the same reference
+	Given I have a product instance with the id 5
+	And I have the same product instance
+	When I compare the two instances
+	Then the equality should be true
+
 Scenario: Comparing two entities of diferent type and same id
 	Given I have a product instance with the id 5
 	And I have a category instance with the id 5
 	When I compare the two instances
 	Then the equality should be false
 
+Scenario: Differentiate two null entities
+	Given I have a null product
+	And I have another null product
+	When I check the diference of the two instances
+	Then the diference should be false
+
+Scenario: Differentiate two entities one null and another not
+	Given I have a null product
+	And I have another product instance with the id 5
+	When I check the diference of the two instances
+	Then the diference should be true
+
+Scenario: Differentiate two entities one not null and another null
+	Given I have a product instance with the id 5
+	And I have another null product
+	When I check the diference of the two instances
+	Then the diference should be true
+
+Scenario: Comparing an entity with one ordinary object
+	Given I have a product instance with the id 5
+	And I have an ordinary object
+	When I compare the entity with the ordinary object
+	Then the equality should be false
+	
+Scenario: Comparing an entity with a null ordinary object
+	Given I have a product instance with the id 5
+	And I have a null ordinary object
+	When I compare the entity with the ordinary object
+	Then the equality should be false
+
+Scenario: Comparing an entity with a entity boxed in an ordinary object
+	Given I have a product instance with the id 5
+	And I have a boxed product instance with the id 5 in ordinary object
+	When I compare the entity with the ordinary object
+	Then the equality should be true
+
 Scenario: Comparing the Hash Code of two entities of the same type and id equals 0
 	Given I have a product instance with the id 0
 	And I have another product instance with the id 0

LiteFx.Specs/EntitySpecs/EntitiesEquality.feature.cs

 //      This code was generated by SpecFlow (http://www.specflow.org/).
 //      SpecFlow Version:1.9.0.77
 //      SpecFlow Generator Version:1.9.0.0
-//      Runtime Version:4.0.30319.296
+//      Runtime Version:4.0.30319.34011
 // 
 //      Changes to this file may cause incorrect behavior and will be lost if
 //      the code is regenerated.
         }
         
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Differentiate two entities of the same type and id")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void DifferentiateTwoEntitiesOfTheSameTypeAndId()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Differentiate two entities of the same type and id", ((string[])(null)));
+#line 12
+this.ScenarioSetup(scenarioInfo);
+#line 13
+ testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 14
+ testRunner.And("I have another product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 15
+ testRunner.When("I check the diference of the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 16
+ testRunner.Then("the diference should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
         [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing two entities of the same type and diferent id")]
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
         public virtual void ComparingTwoEntitiesOfTheSameTypeAndDiferentId()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two entities of the same type and diferent id", ((string[])(null)));
-#line 12
+#line 18
 this.ScenarioSetup(scenarioInfo);
-#line 13
+#line 19
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 14
+#line 20
  testRunner.And("I have another product instance with the id 10", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 15
+#line 21
  testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 16
+#line 22
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         }
         
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing two entities of the same type and id equals 0")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void ComparingTwoEntitiesOfTheSameTypeAndIdEquals0()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two entities of the same type and id equals 0", ((string[])(null)));
+#line 24
+this.ScenarioSetup(scenarioInfo);
+#line 25
+ testRunner.Given("I have a product instance with the id 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 26
+ testRunner.And("I have another product instance with the id 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 27
+ testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 28
+ testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing two entities variables of the same reference")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void ComparingTwoEntitiesVariablesOfTheSameReference()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two entities variables of the same reference", ((string[])(null)));
+#line 30
+this.ScenarioSetup(scenarioInfo);
+#line 31
+ testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 32
+ testRunner.And("I have the same product instance", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 33
+ testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 34
+ testRunner.Then("the equality should be true", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
         [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing two entities of diferent type and same id")]
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
         public virtual void ComparingTwoEntitiesOfDiferentTypeAndSameId()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two entities of diferent type and same id", ((string[])(null)));
-#line 18
+#line 36
 this.ScenarioSetup(scenarioInfo);
-#line 19
+#line 37
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 20
+#line 38
  testRunner.And("I have a category instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 21
+#line 39
  testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 22
+#line 40
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void ComparingTheHashCodeOfTwoEntitiesOfTheSameTypeAndId()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing the Hash Code of two entities of the same type and id", ((string[])(null)));
-#line 24
+#line 42
 this.ScenarioSetup(scenarioInfo);
-#line 25
+#line 43
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 26
+#line 44
  testRunner.And("I have another product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 27
+#line 45
  testRunner.When("I compare the Hash Code of this two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 28
+#line 46
  testRunner.Then("the equality should be true", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void ComparingTheHashCodeOfTwoEntitiesOfTheSameTypeAndDiferentId()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing the Hash Code of two entities of the same type and diferent id", ((string[])(null)));
-#line 30
+#line 48
 this.ScenarioSetup(scenarioInfo);
-#line 31
+#line 49
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 32
+#line 50
  testRunner.And("I have another product instance with the id 10", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 33
+#line 51
  testRunner.When("I compare the Hash Code of this two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 34
+#line 52
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void ComparingTheHashCodeOfTwoTwoEntitiesOfDiferentTypeAndSameId()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing the Hash Code of two two entities of diferent type and same id", ((string[])(null)));
-#line 36
+#line 54
 this.ScenarioSetup(scenarioInfo);
-#line 37
+#line 55
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 38
+#line 56
  testRunner.And("I have a category instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 39
+#line 57
  testRunner.When("I compare the Hash Code of this two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 40
+#line 58
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void ComparingTwoNullEntities()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two null entities", ((string[])(null)));
-#line 42
+#line 60
 this.ScenarioSetup(scenarioInfo);
-#line 43
+#line 61
  testRunner.Given("I have a null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 44
+#line 62
  testRunner.And("I have another null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 45
+#line 63
  testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 46
+#line 64
  testRunner.Then("the equality should be true", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void ComparingTwoEntitiesOneNullAndAnotherNot()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two entities one null and another not", ((string[])(null)));
-#line 48
+#line 66
 this.ScenarioSetup(scenarioInfo);
-#line 49
+#line 67
  testRunner.Given("I have a null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 50
+#line 68
  testRunner.And("I have another product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 51
+#line 69
  testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 52
+#line 70
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void ComparingTwoEntitiesOneNotNullAndAnotherNull()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing two entities one not null and another null", ((string[])(null)));
-#line 54
+#line 72
 this.ScenarioSetup(scenarioInfo);
-#line 55
+#line 73
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 56
+#line 74
  testRunner.And("I have another null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 57
+#line 75
  testRunner.When("I compare the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 58
+#line 76
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         }
         
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Differentiate two null entities")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void DifferentiateTwoNullEntities()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Differentiate two null entities", ((string[])(null)));
+#line 78
+this.ScenarioSetup(scenarioInfo);
+#line 79
+ testRunner.Given("I have a null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 80
+ testRunner.And("I have another null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 81
+ testRunner.When("I check the diference of the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 82
+ testRunner.Then("the diference should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Differentiate two entities one null and another not")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void DifferentiateTwoEntitiesOneNullAndAnotherNot()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Differentiate two entities one null and another not", ((string[])(null)));
+#line 84
+this.ScenarioSetup(scenarioInfo);
+#line 85
+ testRunner.Given("I have a null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 86
+ testRunner.And("I have another product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 87
+ testRunner.When("I check the diference of the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 88
+ testRunner.Then("the diference should be true", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Differentiate two entities one not null and another null")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void DifferentiateTwoEntitiesOneNotNullAndAnotherNull()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Differentiate two entities one not null and another null", ((string[])(null)));
+#line 90
+this.ScenarioSetup(scenarioInfo);
+#line 91
+ testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 92
+ testRunner.And("I have another null product", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 93
+ testRunner.When("I check the diference of the two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 94
+ testRunner.Then("the diference should be true", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing an entity with one ordinary object")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void ComparingAnEntityWithOneOrdinaryObject()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing an entity with one ordinary object", ((string[])(null)));
+#line 96
+this.ScenarioSetup(scenarioInfo);
+#line 97
+ testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 98
+ testRunner.And("I have an ordinary object", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 99
+ testRunner.When("I compare the entity with the ordinary object", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 100
+ testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing an entity with a null ordinary object")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void ComparingAnEntityWithANullOrdinaryObject()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing an entity with a null ordinary object", ((string[])(null)));
+#line 102
+this.ScenarioSetup(scenarioInfo);
+#line 103
+ testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 104
+ testRunner.And("I have a null ordinary object", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 105
+ testRunner.When("I compare the entity with the ordinary object", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 106
+ testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing an entity with a entity boxed in an ordinary object")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
+        public virtual void ComparingAnEntityWithAEntityBoxedInAnOrdinaryObject()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing an entity with a entity boxed in an ordinary object", ((string[])(null)));
+#line 108
+this.ScenarioSetup(scenarioInfo);
+#line 109
+ testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 110
+ testRunner.And("I have a boxed product instance with the id 5 in ordinary object", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 111
+ testRunner.When("I compare the entity with the ordinary object", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 112
+ testRunner.Then("the equality should be true", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
         [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Comparing the Hash Code of two entities of the same type and id equals 0")]
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Entities Equality")]
         public virtual void ComparingTheHashCodeOfTwoEntitiesOfTheSameTypeAndIdEquals0()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Comparing the Hash Code of two entities of the same type and id equals 0", ((string[])(null)));
-#line 60
+#line 114
 this.ScenarioSetup(scenarioInfo);
-#line 61
+#line 115
  testRunner.Given("I have a product instance with the id 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 62
+#line 116
  testRunner.And("I have another product instance with the id 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 63
+#line 117
  testRunner.When("I compare the Hash Code of this two instances", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 64
+#line 118
  testRunner.Then("the equality should be false", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void AddingTwoEntitiesOfTheSameTypeAndIdIntoAHashSet()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Adding two entities of the same type and id into a HashSet", ((string[])(null)));
-#line 66
+#line 120
 this.ScenarioSetup(scenarioInfo);
-#line 67
+#line 121
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 68
+#line 122
  testRunner.And("I have another product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 69
+#line 123
  testRunner.And("a HashSet instance", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 70
+#line 124
  testRunner.When("I add the two instances to a HashSet", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 71
+#line 125
  testRunner.Then("the HashSet count should be 1", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void AddingTwoEntitiesOfTheSameTypeAndDiferentIdIntoAHashSet()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Adding two entities of the same type and diferent id into a HashSet", ((string[])(null)));
-#line 73
+#line 127
 this.ScenarioSetup(scenarioInfo);
-#line 74
+#line 128
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 75
+#line 129
  testRunner.And("I have another product instance with the id 10", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 76
+#line 130
  testRunner.And("a HashSet instance", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 77
+#line 131
  testRunner.When("I add the two instances to a HashSet", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 78
+#line 132
  testRunner.Then("the HashSet count should be 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void AddingTwoEntitiesOfDiferentTypesAndSameIdIntoAHashSet()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Adding two entities of diferent types and same id into a HashSet", ((string[])(null)));
-#line 80
+#line 134
 this.ScenarioSetup(scenarioInfo);
-#line 81
+#line 135
  testRunner.Given("I have a product instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 82
+#line 136
  testRunner.And("I have a category instance with the id 5", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 83
+#line 137
  testRunner.And("a HashSet instance", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
-#line 84
+#line 138
  testRunner.When("I add the two instances to a HashSet", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 85
+#line 139
  testRunner.Then("the HashSet count should be 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();

LiteFx.Specs/EntitySpecs/EntitiesEqualityStepDefinition.cs

     {
         EntityBase<int> entity;
         EntityBase<int> anotherEntity;
+        object ordinaryObject;
 
         bool equality;
+        bool diference;
 
         HashSet<EntityBase<int>> hashSet;
 
             anotherEntity = new Product() { Id = id };
         }
 
+        [Given(@"I have a boxed product instance with the id (.*) in ordinary object")]
+        public void GivenIHaveAnotherProductInstanceWithTheIdBoxedInOrdinaryObject(int id)
+        {
+            ordinaryObject = new Product() { Id = id };
+        }
+
+        [Given(@"I have the same product instance")]
+        public void GivenIHaveTheSameProductInstance()
+        {
+            anotherEntity = entity;
+        }
+
         [Given(@"I have a category instance with the id (.*)")]
         public void GivenIHaveACategoryInstanceWithTheId(int id)
         {
             anotherEntity = null;
         }
 
+        [Given(@"I have an ordinary object")]
+        public void GivenIHaveAnOrdinaryObject()
+        {
+            ordinaryObject = new object();
+        }
+
+        [Given(@"I have a null ordinary object")]
+        public void GivenIHaveANullOrdinaryObject()
+        {
+            ordinaryObject = null;
+        }
+
         [Given(@"a HashSet instance")]
         public void GivenAHashSetInstance()
         {
             equality = entity == anotherEntity;
         }
 
+        [When(@"I check the diference of the two instances")]
+        public void WhenICheckTheDiferenceOfTheTwoInstances()
+        {
+            diference = entity != anotherEntity;
+        }
+
+        [When(@"I compare the entity with the ordinary object")]
+        public void WhenICompareTheEntityWithTheOrdinaryObject()
+        {
+            equality = entity.Equals(ordinaryObject);
+        }
+
         [When(@"I compare the Hash Code of this two instances")]
         public void WhenICompareTheHashCodeOfThisTwoInstances()
         {
             Assert.AreEqual(result, this.equality);
         }
 
+        [Then(@"the diference should be (.*)")]
+        public void ThenTheDiferenceShouldBeFalse(bool result)
+        {
+            Assert.AreEqual(result, this.diference);
+        }
+        
         [Then(@"the HashSet count should be (.*)")]
         public void ThenTheHashSetCountShouldBe(int count)
         {

LiteFx.Specs/ValidationSpecs/Category.cs

 
 		public override void ConfigureValidation()
 		{
-			Assert<Category>().Que(c => c.Name).NaoSejaNuloOuVazio();
+			Assert<Category>()
+                .Que(c => c.Name)
+                    .NaoSejaNuloOuVazio();
 		}
 	}
 
 		{
 			Assert<DerivedCategory>()
 				.Que(s => s.Rank)
-				.MaiorQueOuIgual(() => MinRank);
+				    .MaiorQueOuIgual(() => MinRank);
 
 			base.ConfigureValidation();
 		}
 		{
 			Assert<CategoryWithNullableMember>()
 				.Que(c => c.Creation)
-				.Maximo(new DateTime(2050, 1, 1));
+				    .Maximo(new DateTime(2050, 1, 1));
 
 			base.ConfigureValidation();
 		}

LiteFx.Specs/ValidationSpecs/ValidatingAType.feature

 	When I call the validate method
 	Then the count of validationResult collection should be 1
 
+Scenario: Check a invalid Type skiping the validation
+	Given a invalid Type
+	And I call skip validation method
+	When I call the validate method
+	Then the count of validationResult collection should be 0
 
 Scenario: Check a valid Derived Type
 	Given a valid Derived Type
 Scenario: Check a valid Type with a Nullable member set to null
 	Given a valid Type with a Nullable member set to null
 	When I call the validate method
-	Then the count of validationResult collection should be 0
+	Then the count of validationResult collection should be 0
+
+Scenario: Get client validation from a Type
+	Given a valid Type
+	When I call the GetClientValidationData method passing the property Name
+	Then the client validation rule collection should be have the required rule

LiteFx.Specs/ValidationSpecs/ValidatingAType.feature.cs

 //      This code was generated by SpecFlow (http://www.specflow.org/).
 //      SpecFlow Version:1.9.0.77
 //      SpecFlow Generator Version:1.9.0.0
-//      Runtime Version:4.0.30319.296
+//      Runtime Version:4.0.30319.34011
 // 
 //      Changes to this file may cause incorrect behavior and will be lost if
 //      the code is regenerated.
         }
         
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Check a invalid Type skiping the validation")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Validating a Type")]
+        public virtual void CheckAInvalidTypeSkipingTheValidation()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Check a invalid Type skiping the validation", ((string[])(null)));
+#line 17
+this.ScenarioSetup(scenarioInfo);
+#line 18
+ testRunner.Given("a invalid Type", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 19
+ testRunner.And("I call skip validation method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And ");
+#line 20
+ testRunner.When("I call the validate method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 21
+ testRunner.Then("the count of validationResult collection should be 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
         [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Check a valid Derived Type")]
         [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Validating a Type")]
         public virtual void CheckAValidDerivedType()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Check a valid Derived Type", ((string[])(null)));
-#line 18
+#line 23
 this.ScenarioSetup(scenarioInfo);
-#line 19
+#line 24
  testRunner.Given("a valid Derived Type", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 20
+#line 25
  testRunner.When("I call the validate method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 21
+#line 26
  testRunner.Then("the count of validationResult collection should be 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void CheckAInvalidDerivedType()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Check a invalid Derived Type", ((string[])(null)));
-#line 23
+#line 28
 this.ScenarioSetup(scenarioInfo);
-#line 24
+#line 29
  testRunner.Given("a invalid Derived Type", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 25
+#line 30
  testRunner.When("I call the validate method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 26
+#line 31
  testRunner.Then("the count of validationResult collection should be 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void CheckAValidTypeWithANullableMember()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Check a valid Type with a Nullable member", ((string[])(null)));
-#line 28
+#line 33
 this.ScenarioSetup(scenarioInfo);
-#line 29
+#line 34
  testRunner.Given("a valid Type with a Nullable member", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 30
+#line 35
  testRunner.When("I call the validate method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 31
+#line 36
  testRunner.Then("the count of validationResult collection should be 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void CheckAInvalidTypeWithANullableMember()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Check a invalid Type with a Nullable member", ((string[])(null)));
-#line 33
+#line 38
 this.ScenarioSetup(scenarioInfo);
-#line 34
+#line 39
  testRunner.Given("a invalid Type with a Nullable member", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 35
+#line 40
  testRunner.When("I call the validate method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 36
+#line 41
  testRunner.Then("the count of validationResult collection should be 2", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         public virtual void CheckAValidTypeWithANullableMemberSetToNull()
         {
             TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Check a valid Type with a Nullable member set to null", ((string[])(null)));
-#line 38
+#line 43
 this.ScenarioSetup(scenarioInfo);
-#line 39
+#line 44
  testRunner.Given("a valid Type with a Nullable member set to null", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
-#line 40
+#line 45
  testRunner.When("I call the validate method", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
-#line 41
+#line 46
  testRunner.Then("the count of validationResult collection should be 0", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
 #line hidden
             this.ScenarioCleanup();
         }
+        
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Get client validation from a Type")]
+        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Validating a Type")]
+        public virtual void GetClientValidationFromAType()
+        {
+            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Get client validation from a Type", ((string[])(null)));
+#line 48
+this.ScenarioSetup(scenarioInfo);
+#line 49
+ testRunner.Given("a valid Type", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Given ");
+#line 50
+ testRunner.When("I call the GetClientValidationData method passing the property Name", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When ");
+#line 51
+ testRunner.Then("the client validation rule collection should be have the required rule", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then ");
+#line hidden
+            this.ScenarioCleanup();
+        }
     }
 }
 #pragma warning restore

LiteFx.Specs/ValidationSpecs/ValidatingATypeStepDefinition.cs

 using System.Linq;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using TechTalk.SpecFlow;
+using LiteFx.Validation.ClientValidationRules;
 
 namespace LiteFx.Specs.ValidationSpecs
 {
 	{
 		Category type;
 		IEnumerable<ValidationResult> results;
+        IEnumerable<ClientValidationRule> clientValidationRules;
 
 		[Given(@"a valid Type")]
 		public void GivenAValidType()
 			type = new CategoryWithNullableMember() { Name = "Valid Type", Creation = null };
 		}
 
+        [Given]
+        public void Given_I_call_skip_validation_method()
+        {
+            type.SkipValidation();
+        }
+
 		[When(@"I call the validate method")]
 		public void WhenICallTheValidateMethod()
 		{
 			results = type.Validate();
 		}
 
+        [When(@"I call the GetClientValidationData method passing the property (.*)")]
+        public void WhenICallTheGetClientValidationDataMethodPassingThePropertyName(string propertyName)
+        {
+            clientValidationRules = type.GetClientValidationData(propertyName);
+        }
+
+        [Then(@"the client validation rule collection should be have the (.*) rule")]
+        public void ThenTheClientValidationRuleCollectionShouldBeHaveThe_Rule(string rule)
+        {
+            Assert.IsTrue(clientValidationRules.Any(c => c.ValidationType == rule));
+        }
+
 		[Then(@"the count of validationResult collection should be (.*)")]
 		public void ThenTheCountOfValidationResultCollectionShouldBe(int count)
 		{

LiteFx.Web.NHibernate/SessionPerRequestModule.cs

 			{
 				try
 				{
+                    SessionFactoryManager.Current.Flush();
 					SessionFactoryManager.Current.CommitTransaction();
 				}
 				catch
 		.nuget\packages.config = .nuget\packages.config
 	EndProjectSection
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sample", "Sample", "{7B20C787-BA4F-4539-A6FB-5755A4AA6078}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Domain", "Sample.Domain\Sample.Domain.csproj", "{146A2878-17EB-46CA-AF83-8616F31E4964}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Infrastructure", "Sample.Infrastructure\Sample.Infrastructure.csproj", "{6B94067B-1C18-4151-90C1-A25EAF0CECB7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Web.Mvc", "Sample.Web.Mvc\Sample.Web.Mvc.csproj", "{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
 		{D763DF6B-ECCC-4960-8914-9949AADF37DC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
 		{D763DF6B-ECCC-4960-8914-9949AADF37DC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{D763DF6B-ECCC-4960-8914-9949AADF37DC}.Release|x86.ActiveCfg = Release|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Release|Any CPU.Build.0 = Release|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{146A2878-17EB-46CA-AF83-8616F31E4964}.Release|x86.ActiveCfg = Release|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7}.Release|x86.ActiveCfg = Release|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		{CF0B5DF4-C2E0-496C-9B68-41059FB2B1A0} = {5C1A2F3F-6B58-45EA-A100-2CF32382E4F3}
 		{EFF9B88D-5D36-450E-82B6-DCE9A7140157} = {82460974-1AE8-40DA-B7FD-94467329909C}
 		{D763DF6B-ECCC-4960-8914-9949AADF37DC} = {A1DF342A-1C09-4728-87CB-7FB557757490}
+		{146A2878-17EB-46CA-AF83-8616F31E4964} = {7B20C787-BA4F-4539-A6FB-5755A4AA6078}
+		{6B94067B-1C18-4151-90C1-A25EAF0CECB7} = {7B20C787-BA4F-4539-A6FB-5755A4AA6078}
+		{77129F46-19F3-4CD8-A8D9-5B9D27C5B2BC} = {7B20C787-BA4F-4539-A6FB-5755A4AA6078}
 	EndGlobalSection
 	GlobalSection(TestCaseManagementSettings) = postSolution
 		CategoryFile = LiteFx.vsmdi

LiteFx/EntityBase.cs

 namespace LiteFx
 {
 	public abstract class EntityBase { }
+
 	/// <summary>
 	/// Base class for entities.
 	/// </summary>
 	public abstract class EntityBase<TId> : EntityBase, IEquatable<EntityBase<TId>>
 		where TId : IEquatable<TId>
 	{
+        private int? hashcodeCache;
+
 		/// <summary>
 		/// Entity id.
 		/// </summary>
 		[ScaffoldColumn(false)]
 		public virtual TId Id { get; set; }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        [ScaffoldColumn(false)]
+        public virtual bool Transient { get { return Id.Equals(default(TId)); } }
+
 		public virtual bool Equals(EntityBase<TId> other)
 		{
 			if (ReferenceEquals(other, null)) return false;
 
+            if (ReferenceEquals(this, other)) return true;
+
+            if (this.Transient || other.Transient) return false;
+
 			if (!isSameTypeOf(other)) return false;
 
 			return Id.Equals(other.Id);
 
 		public override int GetHashCode()
 		{
-			if (Id.Equals(default(TId)))
-				return base.GetHashCode();
+            if (hashcodeCache.HasValue) return hashcodeCache.Value;
 
-			return GetType().GetHashCode() + Id.GetHashCode();
+			if (Transient)
+				hashcodeCache = base.GetHashCode();
+            else
+			    hashcodeCache = GetType().GetHashCode() + Id.GetHashCode();
+
+            return hashcodeCache.Value;
 		}
 
 		public static bool operator ==(EntityBase<TId> left, EntityBase<TId> right)

LiteFx/EntityBaseWithValidation.cs

 		}
 
 		#region IValidation Members
+        /// <summary>
+        /// Verify the entity against the domain rules described in ConfigureValidation method.
+        /// </summary>
+        /// <returns>Collection of <see cref="ValidationResults"/>.</returns>
 		public virtual IEnumerable<ValidationResult> Validate()
 		{
 			ValidationContext validationContext = new ValidationContext(this, null, null);
 		}
 
 		/// <summary>
-		/// Verify if the entity is valid."/>.
+		/// Verify if the entity is valid.
 		/// </summary>
 		public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
 		{
 
 		private bool skipValidation = false;
 
+        /// <summary>
+        /// When called every call of Validate method will always return an empty collection of <see cref="ValidationResults"/>, even if the entity is in an invalid state.
+        /// </summary>
 		public virtual void SkipValidation()
 		{
 			skipValidation = true;
 		///     {
 		///         Assert<MyEntity>()
 		///             .That(e => e.Name)
-		///             .IsNotNullOrEmpty();
+		///             .IsRequired();
 		///     }
 		/// }
 		/// ]]>
 		/// </example>
 		public abstract void ConfigureValidation();
 
+        /// <summary>
+        /// Returns client validation rule to help client validation libraries.
+        /// </summary>
+        /// <param name="propertyName">Property name reference to get the client validation rules.</param>
+        /// <returns><see cref="ClientValidationRule"/></returns>
 		public virtual IEnumerable<ClientValidationRule> GetClientValidationData(string propertyName)
 		{
 			if (assert == null)
 				ConfigureValidation();
 
-			var assertions = assert.Assertions.Where(a => a.AccessorMemberNames.Contains(propertyName)).Select(a => a);
-			foreach (var assertion in assertions)
-			{
-				foreach (var predicate in assertion.BasePredicates)
-				{
-					if (predicate.ClienteValidationRule != null && assertion.WhenAssertion == null)
-					{
-						predicate.ClienteValidationRule.ErrorMessage = string.Format(predicate.ValidationMessage, ValidationHelper.ResourceManager.GetString(propertyName));
-						yield return predicate.ClienteValidationRule;
-					}
-				}
-			}
+            return assert.GetClientValidationData(propertyName);
 		}
 		#endregion
 	}

LiteFx/Validation/Assert.cs

-using System.Collections.Generic;
+using LiteFx.Validation.ClientValidationRules;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
+using System.Linq;
 
 namespace LiteFx.Validation
 {
     public class Assert : IAssert
     {
         private List<Assertion> assertions;
+
+        /// <summary>
+        /// Collection of assertions that will be check against the object.
+        /// </summary>
         public List<Assertion> Assertions
         {
             get { return assertions ?? (assertions = new List<Assertion>()); }
         }
 
+        /// <summary>
+        /// Check all assertions against the instanceReference.
+        /// </summary>
+        /// <param name="instanceReference">Instance that will be validated.</param>
+        /// <param name="validationResults">Validation results reference to be incremented if any errors are found.</param>
+        /// <returns>The validation results reference collection.</returns>
         public IEnumerable<ValidationResult> Validate(object instanceReference, IList<ValidationResult> validationResults)
         {
             foreach (var item in Assertions)
             {
                 item.Evaluate(instanceReference, validationResults);
             }
-            
+
             return validationResults;
         }
+
+        /// <summary>
+        /// Returns client validation rule to help client validation libraries.
+        /// </summary>
+        /// <param name="propertyName">Property name reference to get the client validation rules.</param>
+        /// <returns><see cref="ClientValidationRule"/></returns>
+        public IEnumerable<ClientValidationRule> GetClientValidationData(string propertyName)
+        {
+            var predicates = Assertions
+                .Where(a => a.AccessorMemberNames.Contains(propertyName) && a.WhenAssertion == null)
+                    .SelectMany(a => a.BasePredicates)
+                        .Where(p => p.ClienteValidationRule != null);
+
+            foreach (var predicate in predicates)
+            {
+                predicate.ClienteValidationRule.ErrorMessage = string.Format(predicate.ValidationMessage, ValidationHelper.ResourceManager.GetString(propertyName));
+                yield return predicate.ClienteValidationRule;
+            }
+        }
     }
 
     public class Assert<T> : Assert, IAssert<T> { }

LiteFx/Validation/ClientValidationRules/ClientValidationRule.cs

 
 namespace LiteFx.Validation.ClientValidationRules
 {
+    /// <summary>
+    /// Class that represent rules for client validation.
+    /// </summary>
     public class ClientValidationRule
     {
         private readonly Dictionary<string, object> _validationParameters = new Dictionary<string, object>();
 
         public string ErrorMessage { get; set; }
 
+        /// <summary>
+        /// Validation parameters. Eg: <code>ValidationParameters.Add('max', 50)</code> For the type of validation 'length' you can use the 'max' parameter set to 50 and 
+        /// the client validation mechanism will know that this field accepts a maximum of 50 character set.
+        /// </summary>
         public IDictionary<string, object> ValidationParameters
         {
             get
             }
         }
 
+        /// <summary>
+        /// Type of the client validation. Eg: length, required.
+        /// </summary>
         public string ValidationType
         {
             get

LiteFx/Validation/ClientValidationRules/MaxLengthClientValidationRule.cs

 
 namespace LiteFx.Validation.ClientValidationRules
 {
+    /// <summary>
+    /// Rule to express the maximum field length.
+    /// </summary>
     public class MaxLengthClientValidationRule : ClientValidationRule
     {
         public MaxLengthClientValidationRule(int maxLength)

LiteFx/Validation/ClientValidationRules/RequiredClientValidationRule.cs

-
-using LiteFx.Properties;
+using LiteFx.Properties;
+
 namespace LiteFx.Validation.ClientValidationRules
 {
-	public class RequiredClientValidationRule : ClientValidationRule
-	{
-		public RequiredClientValidationRule()
-		{
-			ValidationType = "required";
-			ErrorMessage = Resources.TheFieldXIsRequired;
-		}
-	}
-}
+    /// <summary>
+    /// Rule to express that the field is required.
+    /// </summary>
+    public class RequiredClientValidationRule : ClientValidationRule
+    {
+        private static RequiredClientValidationRule _rule = new RequiredClientValidationRule();
+
+        public static RequiredClientValidationRule Rule { get { return _rule; } }
+
+        public RequiredClientValidationRule()
+        {
+            ValidationType = "required";
+            ErrorMessage = Resources.TheFieldXIsRequired;
+        }
+    }
+}

LiteFx/Validation/IAssert.cs

-using System.Collections.Generic;
+using LiteFx.Validation.ClientValidationRules;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 
 namespace LiteFx.Validation
 	{
 		List<Assertion> Assertions { get; }
 		IEnumerable<ValidationResult> Validate(object instanceReference, IList<ValidationResult> validationContext);
+        IEnumerable<ClientValidationRule> GetClientValidationData(string propertyName);
 	}
 
 	public interface IAssert<out T> : IAssert

LiteFx/Validation/PtBr/ValidationHelperPtBr.cs

 			return ValidationHelper.IsNullOrEmpty(validator);
 		}
 
+        public static Validator<T, string> EhObrigatorio<T>(this Validator<T, string> validator)
+        {
+            return ValidationHelper.IsNotNullOrEmpty(validator);
+        }
+
+        public static Validator<T, string> Obrigatorio<T>(this Validator<T, string> validator)
+        {
+            return ValidationHelper.IsNotNullOrEmpty(validator);
+        }
+
 		public static Validator<T, string> NaoSejaNuloOuVazio<T>(this Validator<T, string> validator)
 		{
 			return ValidationHelper.IsNotNullOrEmpty(validator);

LiteFx/Validation/ValidationHelper.cs

 			return validator;
 		}
 
-		public static Validator<T, TResult> IsSatisfied<T, TResult>(this Validator<T, TResult> validator, Func<TResult, bool> expression, string message, string validationType)
-		{
-			ClientValidationRule clientValidationRule = new ClientValidationRule { ErrorMessage = message, ValidationType = validationType };
-			validator.Assertion.Predicates.Add(new Predicate<TResult>(expression, message, clientValidationRule));
-			return validator;
-		}
-
 		public static Validator<T, TResult> IsSatisfied<T, TResult>(this Validator<T, TResult> validator, Func<TResult, bool> expression, string message, ClientValidationRule clientValidationRule)
 		{
 			validator.Assertion.Predicates.Add(new Predicate<TResult>(expression, message, clientValidationRule));
 			return IsSatisfied(validator, p => string.IsNullOrEmpty(p), Resources.TheFieldXMustBeNullOrEmpty);
 		}
 
+        public static Validator<T, string> IsRequired<T>(this Validator<T, string> validator)
+        {
+            return IsNotNullOrEmpty(validator);
+        }
+
+        public static Validator<T, string> Required<T>(this Validator<T, string> validator)
+        {
+            return IsNotNullOrEmpty(validator);
+        }
+
 		public static Validator<T, string> IsNotNullOrEmpty<T>(this Validator<T, string> validator)
 		{
-			return IsSatisfied(validator, p => !string.IsNullOrEmpty(p), Resources.TheFieldXIsRequired, "required");
+            return IsSatisfied(validator, p => !string.IsNullOrEmpty(p), Resources.TheFieldXIsRequired, RequiredClientValidationRule.Rule);
 		}
 
 		public static Validator<T, string> IsEmpty<T>(this Validator<T, string> validator)
 
 		public static Validator<T, string> IsNotEmpty<T>(this Validator<T, string> validator)
 		{
-            return IsSatisfied(validator, p => string.Empty != p, Resources.TheFieldXIsRequired, "required");
+            RequiredClientValidationRule requiredClientValidationRule = new RequiredClientValidationRule();
+            return IsSatisfied(validator, p => string.Empty != p, Resources.TheFieldXIsRequired, RequiredClientValidationRule.Rule);
 		}
 
 		public static Validator<T, string> MaxLength<T>(this Validator<T, string> validator, int maxLength)
 			{
 				if (p == null) return false;
 				return !p.Id.Equals(0);
-			}, string.Format(Resources.TheFieldXIsRequired, "{0}"), "required");
+            }, string.Format(Resources.TheFieldXIsRequired, "{0}"), RequiredClientValidationRule.Rule);
 		}
 		#endregion
 

Sample.Domain/EntityBase.cs

+using LiteFx;
+
+namespace Sample.Domain
+{
+    public abstract class EntityBase : EntityBaseWithValidation<int> { }
+}

Sample.Domain/Product.cs

+using LiteFx.Validation;
+
+namespace Sample.Domain
+{
+    public class Product : EntityBase
+    {
+        public virtual string Name { get; set; }
+        public virtual decimal Price { get; set; }
+        public virtual bool Discontinued { get; set; }
+        public virtual string Details { get; set; }
+
+        public Product() { }
+
+        public Product(string name, decimal price)
+        {
+            Name = name;
+            Price = price;
+            Discontinued = false;
+        }
+
+        public override void ConfigureValidation()
+        {
+            Assert<Product>()
+                .That(p => p.Name)
+                    .Required()
+                    .MaxLength(100);
+
+            Assert<Product>()
+                .That(p => p.Details)
+                    .MaxLength(1000);
+        }
+    }
+}

Sample.Domain/Properties/AssemblyInfo.cs

+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Sample.Domain")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Sample.Domain")]
+[assembly: AssemblyCopyright("Copyright ©  2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("2cefaa39-cdaf-40bf-853f-e2bce6ef66aa")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

Sample.Domain/Repositories/IProductRepository.cs

+namespace Sample.Domain.Repositories
+{
+    public interface IProductRepository : IRepository<Product> { }
+}

Sample.Domain/Repositories/IRepository.cs

+using LiteFx.Repository;
+
+namespace Sample.Domain.Repositories
+{
+    public interface IRepository<TEntity> : IRepository<TEntity, int>
+    {
+    }
+}

Sample.Domain/Sample.Domain.csproj

+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{146A2878-17EB-46CA-AF83-8616F31E4964}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Sample.Domain</RootNamespace>
+    <AssemblyName>Sample.Domain</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Practices.ServiceLocation">
+      <HintPath>..\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.ComponentModel.DataAnnotations" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="EntityBase.cs" />
+    <Compile Include="Product.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Repositories\IProductRepository.cs" />
+    <Compile Include="Repositories\IRepository.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\LiteFx\LiteFx.csproj">
+      <Project>{c3434a18-591a-4622-9021-6dbc60561c24}</Project>
+      <Name>LiteFx</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

Sample.Domain/packages.config

+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="CommonServiceLocator" version="1.0" targetFramework="net45" />
+</packages>

Sample.Infrastructure/ISampleContext.cs

+using LiteFx;
+using Sample.Domain;
+using System.Linq;
+
+namespace Sample.Infrastructure
+{
+    public interface ISampleContext : IContext<int>
+    {
+        IQueryable<Product> Products { get; }
+    }
+}

Sample.Infrastructure/Mappings/EntityBaseMap.cs

+using FluentNHibernate.Mapping;
+using Sample.Domain;
+
+namespace Sample.Infrastructure.Mappings
+{
+    public class EntityBaseMap<TEntity> : ClassMap<TEntity>
+        where TEntity : EntityBase
+    {
+        public EntityBaseMap()
+        {
+            Id(e => e.Id);
+        }
+    }
+}

Sample.Infrastructure/Mappings/ProductMap.cs

+using Sample.Domain;
+
+namespace Sample.Infrastructure.Mappings
+{
+    public class ProductMap : EntityBaseMap<Product>
+    {
+        public ProductMap()
+        {
+            Map(p => p.Name).Not.Nullable().Length(100);
+            Map(p => p.Price);
+            Map(p => p.Discontinued);
+            Map(p => p.Details).Length(1000);
+        }
+    }
+}

Sample.Infrastructure/Properties/AssemblyInfo.cs

+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Sample.Infrastructure")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Sample.Infrastructure")]
+[assembly: AssemblyCopyright("Copyright ©  2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1e2e37f5-d152-4235-83e1-edbe3487524e")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]