예제 #1
0
        public void SaveTest()
        {
            using (var db = new ASP_DBEntities())
                using (var trans = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
                {
                    try
                    {
                        // 1. Write
                        var session = Guid.NewGuid();
                        var now     = DateTime.Now;

                        var main = new Main();
                        main.session = session;
                        main.created = now;
                        main.changed = now;
                        main.main    = new byte[0];
                        db.Main.Add(main);
                        db.SaveChanges();

                        // 2. Read
                        var query = from m in db.Main
                                    where m.session == session
                                    select m;
                        var read = query.FirstOrDefault();

                        Assert.That(main.created, Is.EqualTo(now));
                    }
                    finally
                    {
                        trans.Rollback();
                    }
                }
        }
예제 #2
0
        public void SaveUpdateTest()
        {
            const int DB_ROUNDTRIP_MILLISECONDS = 500;

            using (var db = new ASP_DBEntities())
                using (var trans = db.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
                {
                    try
                    {
                        var main = new Main();
                        db.Main.Add(main); // add incomplete object, possible unlike with Strongly Typed Datasets
                        main.main = new byte[3] {
                            1, 2, 3
                        };

                        // INSERT: read back inserted and computed values
                        db.SaveChanges();
                        var insertedAt = DateTime.Now;
                        Assert.Multiple(() => // direct assertions on the model object
                        {
                            Assert.That(main.main, Is.EqualTo(new byte[3] {
                                1, 2, 3
                            }));
                            Assert.That(main.created, Is.EqualTo(main.changed));                                              // exact time from the db
                            Assert.That(main.changed, Is.EqualTo(insertedAt).Within(DB_ROUNDTRIP_MILLISECONDS).Milliseconds); // db rounttrip time
                        });

                        // UDPATE: read back updated and computed values
                        Thread.Sleep(500); // greater than db roundtrip time
                        main.main = new byte[3] {
                            4, 5, 6
                        };
                        db.SaveChanges();
                        var createdAt = main.created; // exact time from the db
                        var changedAt = DateTime.Now;
                        Assert.Multiple(() =>         // direct assertions on the model object
                        {
                            Assert.That(main.main, Is.EqualTo(new byte[3] {
                                4, 5, 6
                            }));
                            Assert.That(main.created, Is.EqualTo(createdAt));
                            Assert.That(main.changed, Is.GreaterThan(main.created));
                            Assert.That(main.changed, Is.EqualTo(changedAt).Within(DB_ROUNDTRIP_MILLISECONDS).Milliseconds);
                        });

                        // DELETE: delete with initially detached object
                        var session  = main.session;
                        var detached = new Main {
                            session = session
                        };
                        db.Main.Attach(main); // must exist, otherwise SaveChanges() throws an exception
                        db.Main.Remove(main);
                        db.SaveChanges();
                        this.TestReadInexistent(db, session);
                    }
                    finally
                    {
                        trans.Rollback();
                    }
                }
        }