static void Main(string[] args)
        {


            EntityConnection cn = new EntityConnection("name=ASIEntities7");
            DbConnection dbcn = new SqlConnection( System.Configuration.ConfigurationManager.ConnectionStrings["base dados"].ConnectionString );

            var alnPedro = new Aluno { NumAl = 1001, Nome = "Pedro" };
            alnPedro.AlunosAssEsts = new HashSet<AlunosAssEst>();

            var alnPaula = new Aluno { NumAl = 1002, Nome = "Paula" };
            alnPaula.AlunosAssEsts = new HashSet<AlunosAssEst>();

            using (var ctx1 = new ASIEntities7(cn))
            {
                // em alternativa a usar o Sql Server Profiler, pode fazer:
                //ctx1.Database.Log = Console.Write;

                ctx1.Alunos.Add(alnPedro);
                ctx1.Alunos.Add(alnPaula);

                // ExecuteDML(dbcn, "A trocar as voltas ao EF6 inserindo o Jose ADO.Net(1001)...", "INSERT INTO [BD3_1].[dbo].[Alunos] ([NumAl],[Nome]) VALUES (1001, 'Jose ADO.Net')");
                SaveContextChanges(ctx1, PoliticaConcorrencia.UsarInfoBD);
            }
            
            using (var ctxPessimista = new ASIEntities7(cn))
            {
                // em alternativa a usar o Sql Server Profiler, pode fazer:
                //ctx4.Database.Log = Console.Write;

                Aluno alnPedroCtx = (from a in ctxPessimista.Alunos where a.NumAl == 1001 select a).First();
                alnPedroCtx.Nome = "Pedro ContextoEF6";

                ExecuteDML(dbcn, "O ADO.Net vai mudar o nome do Pedro para 'Pedro ADO.Net'.", "UPDATE [BD3_1].[dbo].[Alunos] SET [Nome] = 'Pedro ADO.Net' WHERE [NumAl] = 1001");
                
                Console.WriteLine("O EF6 vai mudar o nome do Pedro para 'Pedro ContextoEF6'. Antes de gravar, alnPedroCtx.Nome = {0}", alnPedroCtx.Nome);
                SaveContextChanges(ctxPessimista, PoliticaConcorrencia.UsarInfoBD);
                Console.WriteLine("Depois de gravadas as alteracoes com uma politica pessimista (vale o que esta na BD), o nome do Pedro no ambito do contexto EF6 é: alnPedroCtx.Nome = {0})", alnPedroCtx.Nome);
            }

            Console.WriteLine();

            using (var ctxOptimista = new ASIEntities7(cn))
            {
                // em alternativa a usar o Sql Server Profiler, pode fazer:
                //ctx5.Database.Log = Console.Write;

                Aluno alnPedroCtx = (from a in ctxOptimista.Alunos where a.NumAl == 1001 select a).First();
                alnPedroCtx.Nome = "Pedro ContextoEF6";

                ExecuteDML(dbcn, "O ADO.Net vai mudar o nome do Pedro para 'Pedro ADO.Net Outra Vez'.", "UPDATE [BD3_1].[dbo].[Alunos] SET [Nome] = 'Pedro ADO.Net Outra Vez' WHERE [NumAl] = 1001");
                
                Console.WriteLine("O EF6 vai mudar o nome do Pedro para 'Pedro ContextoEF6'. Antes de gravar, alnPedroCtx.Nome = {0}", alnPedroCtx.Nome);
                SaveContextChanges(ctxOptimista, PoliticaConcorrencia.UsarInfoCtx);
                Console.WriteLine("Depois de gravadas as alteracoes com uma politica optimista (vale o que esta no Contexto), o nome do Pedro no ambito do contexto EF6 é: alnPedroCtx.Nome = {0})", alnPedroCtx.Nome);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }
        static void Main(string[] args)
        {


            EntityConnection cn = new EntityConnection("name=ASIEntities7");

            var alnPedro = new Aluno { NumAl = 1001, Nome = "Pedro" };
            alnPedro.AlunosAssEsts = new HashSet<AlunosAssEst>();

            var alnPaula = new Aluno { NumAl = 1002, Nome = "Paula" };
            alnPaula.AlunosAssEsts = new HashSet<AlunosAssEst>();

            using (var ctx1 = new ASIEntities7(cn))
            {
                // em alternativa a usar o Sql Server Profiler, pode fazer:
                ctx1.Database.Log = Console.Write;

                //ctx.Database.Connection.Open();

                //ctx.Configuration.AutoDetectChangesEnabled = false;

                ctx1.Alunos.Add(alnPedro);
                ctx1.Alunos.Add(alnPaula);

                //ctx.ChangeTracker.DetectChanges();

                ctx1.SaveChanges();
            }

            using (var ctx2 = new ASIEntities7(cn))
            {
                // em alternativa a usar o Sql Server Profiler, pode fazer:
                ctx2.Database.Log = Console.Write;

                //ctx2.Configuration.AutoDetectChangesEnabled = false;

                var i1 = new AlunosAssEst { NumAl = 1002, Interesse = "i1" };
                var i2 = new AlunosAssEst { NumAl = 1002, Interesse = "i2" };

                alnPaula.AlunosAssEsts.Add(i1);
                alnPaula.AlunosAssEsts.Add(i2);
                ctx2.AlunosAssEsts.Add(i1);
                ctx2.AlunosAssEsts.Add(i2);

                //ctx2.ChangeTracker.DetectChanges();

                ctx2.SaveChanges(); 

            }

            using (var ctx3 = new ASIEntities7(cn))
            {
                // em alternativa a usar o Sql Server Profiler, pode fazer:
                ctx3.Database.Log = Console.Write;

                //ctx3.Configuration.AutoDetectChangesEnabled = false;

                ctx3.Alunos.Attach(alnPaula);

				//TODO: System.InvalidOperationException {"The object cannot be deleted because it was not found in the ObjectStateManager."}
                ctx3.Alunos.Remove(alnPaula); 
                
                ctx3.SaveChanges();

            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }