public void Update(ShoppingCart shoppingCart)
        {
            if(shoppingCart == null) throw new ArgumentNullException("shoppingCart");

            using(var context = new MyShopReadModelDataContext())
            {
                context.ShoppingCarts.Attach(shoppingCart, true);
                context.SubmitChanges();
            }
        }
        public ShoppingCart FindById(Guid id)
        {
            ShoppingCart result;

            using(var context = new MyShopReadModelDataContext())
            {
                result = context.ShoppingCarts.FirstOrDefault(c => c.Id == id);
            }

            return result;
        }
        public override string[] GetRolesForUser(string username)
        {
            using (var context = new MyShopReadModelDataContext())
            {
                var query = from user in context.Users
                            join role in context.UserRoles on user.Id equals role.UserId
                            where user.Username == username
                            select role.RoleName;

                var buffer = new List<String>();
                buffer.AddRange(query);
                return buffer.ToArray();
            }
        }
        public User FindById(Guid id)
        {
            User result;

            using (var context = new MyShopReadModelDataContext())
            {
                var query = from u in context.Users
                            where u.Id == id
                            select u;

                result = query.FirstOrDefault();
            }

            return result;
        }
        public ActionResult Edit(Guid id)
        {
            using (var context = new MyShopReadModelDataContext())
            {
                var result = context.Products.FirstOrDefault(p => p.Id == id);

                if (result == null)
                {
                    return View("NotFound");
                }
                else
                {
                    return View(result);
                }
            }
        }
        public ShoppingCart FindByVisitorId(Guid visitorId)
        {
            ShoppingCart result = null;

            using (var context = new MyShopReadModelDataContext())
            {
                context.DeferredLoadingEnabled = false;

                var query = from cart in context.ShoppingCarts
                            where cart.VisitorId == visitorId
                            select cart;

                result = query.FirstOrDefault();
            }

            return result;
        }
        public ActionResult Details(Guid id)
        {
            ActionResult result;

            using (var context = new MyShopReadModelDataContext())
            {
                Product product = context.Products.FirstOrDefault(p => p.Id == id);

                if (product == null)
                {
                    result = View("NotFound");
                }
                else
                {
                    result = View(product);
                }
            }

            return result;
        }
        public ActionResult Edit(Product edited)
        {
            using (var context = new MyShopReadModelDataContext())
            {
                Product original = context.Products.FirstOrDefault(p => p.Id == edited.Id);

                if (original == null)
                {
                    return View("NotFound");
                }
                else
                {
                    var commands = new List<ICommand>(GetCommandsForEditedProduct(original, edited));

                    if (commands.Count > 0)
                    {
                        MyShopWebApplication.CommandService.Execute(commands.ToArray());
                    }

                    return View(edited);
                }
            }
        }
        public override bool ValidateUser(String username, String password)
        {
            string hashPassword = EncodePassword(password);

            using (var context = new MyShopReadModelDataContext())
            {
                User user = context.Users.FirstOrDefault(u => u.Username.Equals(username) && u.Password == hashPassword);
                return user != null;
            }
        }
        public override String GetUserNameByEmail(String email)
        {
            String result = null;

            using (var context = new MyShopReadModelDataContext())
            {
                User user = context.Users.FirstOrDefault(u => u.Email == email);
                if (user != null)
                {
                    result = user.Username;
                }
            }

            return result;
        }
        public override MembershipUser GetUser(String username, bool userIsOnline)
        {
            MembershipUser result = null;

            using (var context = new MyShopReadModelDataContext())
            {
                User user = context.Users.FirstOrDefault(u => u.Username == username);
                if (user != null)
                {
                    result = user.ToMembershipUser(Name);
                }
            }

            return result;
        }
        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
        {
            var result = new MembershipUserCollection();

            using (var context = new MyShopReadModelDataContext())
            {
                totalRecords = context.Users.Count();

                foreach (User user in context.Users)
                {
                    result.Add(user.ToMembershipUser(Name));
                }
            }

            return result;
        }
 public ActionResult List()
 {
     using (var context = new MyShopReadModelDataContext())
     {
         var result = context.Products.ToList();
         return View(result);
     }
 }
        public override bool IsUserInRole(string username, string roleName)
        {
            using (var context = new MyShopReadModelDataContext())
            {
                var query = from user in context.Users
                            join role in context.UserRoles on user.Id equals role.UserId
                            where user.Username == username
                            where role.RoleName == roleName
                            select role;

                return query.Count() > 0;
            }
        }