/// <summary>
        /// CustomersテーブルからCustomerに設定されたIDのデータのうち最初の1件を取得する。
        /// データがなければエラー。存在する場合、Customerに設定されたタイムスタンプと
        /// テーブルのタイムスタンプが異なる場合エラー。
        /// </summary>
        /// <param name="db">AddDbContext DB接続情報</param>
        /// <param name="model">Customer Customerのオブジェクト</param>
        /// <returns></returns>
        private static Customer GetFirstRecord(AddDbContext db, Customer model)
        {
            // SQLを構築する
            var q =
                from p in db.Customers
                where p.Id == model.Id
                select p;

            // SQLを実行し、1件目(もしくはデフォルト値)を取得
            //qにはCustomerのデータが入る
            Customer r = q.FirstOrDefault();

            if (r == null)
            {
                // rがnull(参照型のデフォルト値)ならDB未保存
                throw new Exception($"Id[{0}]は、保存されていません。");
            }

            // rが存在する場合に、検索結果(DBの最新)と引数(参照画面描画時)のタイムスタンプを比較し、
            //違ったら例外
            if (IsChanged(r, model))
            {
                throw new System.Data.Entity.Infrastructure.DbUpdateConcurrencyException();
            }
            return(r);
        }
        /// <summary>
        /// 引数のCustomerからIDを取得して、該当するデータをCustomersから削除する。
        /// </summary>
        /// <param name="model">Customer Customerのオブジェクト</param>
        /// <returns></returns>
        public static Customer DeleteItem(Customer model)
        {
            // 接続をオープンする。
            using (AddDbContext db = new AddDbContext())
            {
                // 最新の対象データを取得のうえ、楽観排他のチェックを行う。
                Customer r = GetFirstRecord(db, model);

                // 削除して、変更を保存する。
                db.Customers.Remove(r);
                db.SaveChanges();
                return(null);
            }
        }
        /// <summary>
        /// 引数に従ってCustomerを登録する。
        /// </summary>
        /// <param name="model">登録情報を格納したCustomer</param>
        /// <returns>登録済みのCustomer</returns>
        public static Customer AddItem(Customer model)
        {
            // 接続をオープンする。
            using (AddDbContext db = new AddDbContext())
            {
                // modelに設定された内容をCustomerに追加する。
                db.Customers.Add(model);

                // Addの場合は、登録の瞬間のみ楽観排他がかかる。
                // SaveChange()メソッドがレコード行バージョンを使って、
                // 自動的に楽観排他をかけてくれる。
                // レコード行バージョンは、DBContext作成時の行バージョンを保持しておいて、
                // SaveChange時の行バージョンと比べてくれる。
                db.SaveChanges();
                return(model);
            }
        }
        /// <summary>
        /// 検索条件に従い、Customerテーブルから情報を部分一致検索する。
        /// </summary>
        /// <param name="keyword">キーワード(検索条件)</param>
        /// <returns>IEnumerable:Customer</returns>
        public static IEnumerable <Customer> GetItems(string keyword)
        {
            // 接続をオープンする。接続したDBについての情報はAddDbContext dbにセットする
            using (AddDbContext db = new AddDbContext())
            {
                // SQLを構築する
                var q =
                    from p in db.Customers
                    where p.Name.Contains(keyword)
                    select p;

                // SQLを実行し、1件ごとに処理する
                foreach (Customer x in q)
                {
                    // yieldは、一回呼ばれるごとにイテレータを1件づつ進ませる。
                    yield return(x);
                }
            }
        }
        /// <summary>
        /// 引数に従ってCustomerをアップデートする。
        /// </summary>
        /// <param name="model">変更情報を格納したCustomer</param>
        /// <returns>変更情報を格納したCustomer</returns>
        public static Customer UpdateItem(Customer model)
        {
            //return new Customer();

            // 接続をオープンする。
            using (AddDbContext db = new AddDbContext())
            {
                // 最新の対象データを取得のうえ、楽観排他のチェックを行う。
                // 更新、削除時の楽観排他は、SaveChangesとは別に実施の必要がある。
                // なぜならば、db.SaveChangesは、接続時を楽観排他の起点に取るが、
                // 更新・削除の楽観排他は画面表示時(前回接続時)が楽観排他の起点となるため。
                Customer r = GetFirstRecord(db, model);

                // modelのデータで更新する
                r.Name      = model.Name;
                r.Kana      = model.Kana;
                r.PostCode  = model.PostCode;
                r.Address   = model.Address;
                r.TelNumber = model.TelNumber;
                r.Memo      = model.Memo;
                db.SaveChanges();
                return(r);
            }
        }