public void EventsComponent()
        {
            var x = new FromNhibMetadata
            {
                Id          = 3,
                StrValue    = "12345",
                DateNotNull = DateTime.Today,
                Dec         = 123.45M,
                EnumV       = En1.v1,
                Cmp         = new Cmp1
                {
                    CEnumV    = (En1)66,
                    CStrValue = "1234"
                }
            };

            x.Cmps2.Add(new Cmp2 {
                CEnumV1 = (En1)66, CStrValue1 = "12345XXXX"
            });

            using (var s = OpenSession())
                using (var tx = s.BeginTransaction())
                {
                    Assert.That(
                        () =>
                    {
                        s.Save(x);
                        tx.Commit();
                    },
                        Throws.InstanceOf <InvalidStateException>()
                        .And.Property(nameof(InvalidStateException.InvalidValues)).Length.EqualTo(4),
                        "Saved entity should have raised 4 validation errors");
                }

            x.Cmps2.Clear();
            x.Cmp.CEnumV    = En1.v1;
            x.Cmp.CStrValue = "123";

            x.Cmps2.Add(new Cmp2 {
                CEnumV1 = En1.v2, CStrValue1 = "12345"
            });

            using (var s = OpenSession())
                using (var t = s.BeginTransaction())
                {
                    Assert.That(
                        () =>
                    {
                        s.Save(x);
                        t.Commit();
                    },
                        Throws.Nothing,
                        "Valid entity caused exception on save");
                }
        }
        public void Events()
        {
            var x = new FromNhibMetadata
            {
                Id          = 1,
                StrValue    = "123456",
                DateNotNull = DateTime.Today,
                Dec         = 1234.567M,
                EnumV       = (En1)42
            };

            //x.DateNotNull = null; //!! NHib check not-null itself before integrated validators and throw exception
            // Why it does not check at the same place Length, Precision And scale and so on, if all this known from it configuration?

            using (var s = OpenSession())
                using (var tx = s.BeginTransaction())
                {
                    Assert.That(
                        () =>
                    {
                        s.Save(x);
                        tx.Commit();
                    },
                        Throws.InstanceOf <InvalidStateException>()
                        .And.Property(nameof(InvalidStateException.InvalidValues)).Length.EqualTo(3),
                        "Saved entity should have raised 3 validation errors");
                }

            x.DateNotNull = null;             //But if we will call validators before SavingToNHib Null will be checked
            var ve    = Cfg.Environment.SharedEngineProvider.GetEngine();
            var ivals = ve.Validate(x);

            Assert.That(ivals, Has.Length.EqualTo(4), "Unexpected validation error count for first entity with null date");

            // Don't throw exception if it is valid
            x = new FromNhibMetadata
            {
                Id          = 2,
                StrValue    = "12345",
                DateNotNull = DateTime.Today,
                Dec         = 123.45M,
                EnumV       = En1.v1
            };

            using (var s = OpenSession())
                using (var t = s.BeginTransaction())
                {
                    Assert.That(
                        () =>
                    {
                        s.Save(x);
                        t.Commit();
                    },
                        Throws.Nothing,
                        "Valid entity caused exception on save");
                }

            // Update check
            using (var s = OpenSession())
                using (var t = s.BeginTransaction())
                {
                    var saved = s.Get <FromNhibMetadata>(2);
                    saved.StrValue = "123456";
                    //saved.DateNotNull = null;
                    saved.DateNotNull = DateTime.Now;
                    saved.Dec         = 5678.900M;
                    saved.EnumV       = (En1)66;

                    Assert.That(
                        () => t.Commit(),
                        Throws.InstanceOf <InvalidStateException>()
                        .And.Property(nameof(InvalidStateException.InvalidValues)).Length.EqualTo(3),
                        "Updated entity should have raised 3 validation errors");
                }

            using (var s = OpenSession())
                using (var t = s.BeginTransaction())
                {
                    var saved = s.Get <FromNhibMetadata>(2);
                    saved.StrValue    = "123";
                    saved.DateNotNull = DateTime.Now;
                    saved.Dec         = 876.54M;
                    saved.EnumV       = En1.v2;

                    Assert.That(
                        () => t.Commit(),
                        Throws.Nothing,
                        "Valid entity caused exception on update");
                }
        }