static void Main(string[] args)
        {
            // set database initializer
            Database.SetInitializer<CompanyContext>(new CompanyContextInitializer());

            // initialise EF Profiler
            HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();

            CompanyContext db = new CompanyContext();

            #region EMPLOYEE SELF-RELATIONSHIPS
            //var query = db.Employees
            //    .Include(e => e.Address)
            //    .Include(e => e.Supervisor)
            //    .Include(e => e.Buddies)
            //    .ToList();
            #endregion

            #region ONE-TO-ONE
            //var query = db.Employees
            //    .Include(e => e.Address)
            //    .ToList();
            //var lefts = db.Lefts
            //    .Include(l => l.Right)
            //    .ToList();
            //var rights = db.Rights
            //    .Include(r => r.Left)
            //    .ToList();
            #endregion

            #region ONE-TO-MANY
            var query = db.Departments
                .Include(d => d.Employees)
                .ToList();

            var depToDelete = db.Departments.Find(1);
            db.Departments.Remove(depToDelete);

            db.SaveChanges();

            var newQuery = db.Employees
                .ToList();
            #endregion

            #region MANY-TO-MANY JOIN TABLE
            //var query = db.Employees
            //    .Include(e => e.Projects)
            //    .ToList();
            #endregion

            #region END
            string script = ((IObjectContextAdapter)db).ObjectContext.CreateDatabaseScript();
            Console.ReadLine();
            #endregion
        }
        static void Main(string[] args)
        {
            // set database initializer
            Database.SetInitializer<CompanyContext>(new CompanyContextInitializer());

            CompanyContext db = new CompanyContext();
            db.Configuration.LazyLoadingEnabled = false;
            db.Configuration.ProxyCreationEnabled = true;
            db.Configuration.AutoDetectChangesEnabled = false;

            // new entity
            var newEmp = new Employee { Name = "Kimi" };
            var newEmpEntity = db.Entry(newEmp);
            Console.WriteLine("NEW ENTITY NOT ATTACHED");
            Console.WriteLine(string.Format("Employee {0}, state = {1}", newEmp.Name, newEmpEntity.State));
            PrintTrackedEmployees(db);

            // attach new entity
            db.Entry(newEmp).State = System.Data.EntityState.Added;
            Console.WriteLine("\nNEW ENTITY ATTACHED");
            PrintTrackedEmployees(db);

            #region GET DATA
            // get some objects, eager load so we can access all necessary properties with LL disabled
            var jenson = db.Employees
                .Include(e => e.Projects)
                .Include(e => e.Department)
                .Where(e => e.EmployeeId==1)
                .First();
            var fernando = db.Employees
                .Include(e => e.Projects)
                .Include(e => e.Department)
                .Where(e => e.EmployeeId == 3)
                .First();
            var marketing = db.Departments
                .Include(d => d.Employees)
                .Where(d => d.DepartmentId == 1)
                .First();
            var sales = db.Departments
                .Include(d => d.Employees)
                .Where(d => d.DepartmentId == 2)
                .First();
            var adCampaign = db.Projects
                .Include(p => p.Employees)
                .Where(p => p.ProjectId == 1)
                .First();
            var website = db.Projects
                .Include(p => p.Employees)
                .Where(p => p.ProjectId == 2)
                .First();
            #endregion

            Console.WriteLine("\nRETRIEVED FROM DATABASE");
            PrintDetails(jenson);

            PrintTrackedEmployees(db);

            // change Department for Employee
            jenson.Department = sales;                                          // was marketing
                                                                                // jenson in sales, sales has 4 employees including jenson
            db.ChangeTracker.DetectChanges();                                   // will fix-up always

            Console.WriteLine("\nJENSON CHANGED DEPARTMENT TO SALES");
            PrintDetails(jenson);

            // remove Employee from Project and add Project to Employee
            jenson.Projects.Remove(adCampaign);                                // was on adcampaign and website
            fernando.Projects.Add(website);                                    // was not on any projects
                                                                               // jenson on website only, website includes fernando
            db.Employees.Add(new Employee { Name = "new" });                   // will fix-up if AutoDetectChangesEnabled
            //db.ChangeTracker.DetectChanges();

            Console.WriteLine("\nJENSON REMOVED ADCAMPAIGN, FERNANDO ADDED WEBSITE");
            PrintDetails(jenson);

            marketing.Employees.Add(jenson);                                  // was in sales
                                                                              // jenson in marketing, marketing has 2 employees including jenson
            db.SaveChanges();                                                 // will fix-up if AutoDetectChangesEnabled
            //db.ChangeTracker.DetectChanges();

            Console.WriteLine("\nMARKETING ADDED JENSON");
            PrintDetails(jenson);

            Console.WriteLine("Press any key to finish...");

            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            // set database initializer
            Database.SetInitializer<CompanyContext>(new CompanyContextInitializer());

            // initialise EF Profiler
            HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();

            CompanyContext db = new CompanyContext();

            // Create Address objects
            Address ad1 = new Address
            {
                AddressId = 3,
                PropertyName = "LINQ Tower",
                PropertyNumber = 99,
                PostCode = "G1 1XX"
            };

            Address ad2 = new Address
            {
                AddressId = 4,
                PropertyName = "EF House",
                PropertyNumber = 101,
                PostCode = "G4 0XX"
            };

            // Create Employee objects and associate with Addresses
            Employee emp1 = new Employee
            {
                Name = "Fernando",
                Username = "******",
                PhoneNumber = "1234",
                Address = ad1
            };

            SalariedEmployee emp2 = new SalariedEmployee
            {
                Name = "Felipe",
                Username = "******",
                PhoneNumber = "5678",
                Address = ad2,
                DepartmentName = "Sales",                   // set FK property
                PayGrade = 3
            };

            // Create Department object
            Department dep1 = new Department
            {
                DepartmentName = "Sales"
            };

            // Add Employee objects to Department
            dep1.Employees.Add(emp1);
            //dep1.Employees.Add(emp2);

            db.Departments.Add(dep1);
            //db.Employees.Add(emp1);
            db.Employees.Add(emp2);
            db.SaveChanges();

            // dispose context and open a new context
            db.Dispose();
            db = new CompanyContext();

            // reload entity from database
            //db.Entry(dep1).Reload();

            db.Configuration.LazyLoadingEnabled = false;
            db.Configuration.ProxyCreationEnabled = false;

            List<Employee> employees = db.Employees
                .Include(e => e.Address)
                .Include(e => e.Department)
                .ToList<Employee>();

            Address address = employees[0].Address;

            var query = from d in db.Departments
                        where d.DepartmentName == "Marketing"
                        select d;

            //string command = query.ToString();
            //Console.WriteLine(command + "\n");

            Department department = query.FirstOrDefault();

            // set break point here and inspect objects with debugger
            Console.WriteLine("Press any key to finish...");
            Console.ReadLine();
        }