ユーザ用ツール

サイト用ツール


サイドバー

mvc:リポジトリパターン

以前のリビジョンの文書です


リポジトリパターン

"Data/MvcMovieContext.cs"
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Models;
 
namespace MvcMovie.Data
{
    public class MvcMovieContext : DbContext
    {
 
 
        public MvcMovieContext (DbContextOptions<MvcMovieContext> options)
            : base(options)
        {
        }
 
        public MvcMovieContext(DbContextOptionsBuilder contextOptions)
        {
        }
 
        public DbSet<MvcMovie.Models.Movie> Movie { get; set; } = default!;
 
        public DbSet<MvcMovie.Models.Publish> Publish { get; set; }
    }
}
"Program.cs"
・・・
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MvcMovieContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("MvcMovieContext") ?? throw new InvalidOperationException("Connection string 'MvcMovieContext' not found.")));
・・・
"Models/Pulish.cs"
namespace MvcMovie.Models
{
    public class Publish
    {
        public int Id { get; set; }
        public string Title { get; set; }
    }
}
"Models/IPublishRepository.cs"
using Microsoft.EntityFrameworkCore;
 
namespace MvcMovie.Models
{
    public interface IPublishRepository
    {
        public DbSet<Publish> Publish();
        Task<List<Publish>> ToListAsync();
 
        void Add(Publish publish);
 
        void Update(Publish publish);
        Task<int> SaveChangesAsync();
 
        void Remove(Publish publish);
    }
}
"Models/PubRepository.cs"
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MvcMovie.Data;
 
 
namespace MvcMovie.Models
{
    public class PubRepository : IPublishRepository
    {
        private MvcMovieContext _context;
        public DbSet<Publish> Publish()
        {
            return  _context.Publish;
        }
 
        public PubRepository(MvcMovieContext context)
        {
            _context = context;
        }
 
        public async Task<List<Publish>> ToListAsync()
        {
            return (List<Publish>)await _context.Publish.ToListAsync();
        }
 
        public void Add(Publish publish)
        {
            _context.Add(publish);
        }
 
        public void Update(Publish publish)
        {
            _context.Update(publish);
        }
 
        public void Remove(Publish publish)
        {
            _context.Publish.Remove(publish);
        }
 
 
 
        public Task<int> SaveChangesAsync()
        {
            return _context.SaveChangesAsync();
        }
 
    }
}
"Controllers/PublishesController.cs"
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.Extensions.Options;
using MvcMovie.Data;
using MvcMovie.Models;
 
namespace MvcMovie.Controllers
{
    public class PublishesController : Controller
    {
 
        private IPublishRepository pubrepository;
        private MvcMovieContext _context;
 
        public PublishesController(MvcMovieContext context)
        {
            pubrepository = new PubRepository(context);
        }
 
        public async Task<IActionResult> Index()
        {
            return View(await pubrepository.ToListAsync());
        }
 
        // GET: Publishes/Create
        public IActionResult Create()
        {
            return View();
        }
 
        // POST: Publishes/Create
        // To protect from overposting attacks, enable the specific properties you want to bind to.
        // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Id,Title")] Publish publish)
        {
            if (ModelState.IsValid)
            {
                pubrepository.Add(publish);
                await pubrepository.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            return View(publish);
        }
 
        // GET: Publishes/Edit/5
        public async Task<IActionResult> Edit(int? id)
        {
            if (id == null || pubrepository.Publish() == null)
            {
                return NotFound();
            }
 
            var publish = await pubrepository.Publish().FindAsync(id);
            if (publish == null)
            {
                return NotFound();
            }
            return View(publish);
        }
 
        // POST: Publishes/Edit/5
        // To protect from overposting attacks, enable the specific properties you want to bind to.
        // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Edit(int id, [Bind("Id,Title")] Publish publish)
        {
            if (id != publish.Id)
            {
                return NotFound();
            }
 
            if (ModelState.IsValid)
            {
                try
                {
                    pubrepository.Update(publish);
                    await pubrepository.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!PublishExists(publish.Id))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                return RedirectToAction(nameof(Index));
            }
            return View(publish);
 
        }
        private bool PublishExists(int id)
        {
            return pubrepository.Publish().Any(e => e.Id == id);
        }
 
        // GET: Publishes/Details/5
        public async Task<IActionResult> Details(int? id)
        {
            if (id == null || pubrepository.Publish() == null)
            {
                return NotFound();
            }
 
            var publish = await pubrepository.Publish()
                .FirstOrDefaultAsync(m => m.Id == id);
            if (publish == null)
            {
                return NotFound();
            }
 
            return View(publish);
        }
 
        // GET: Publishes/Delete/5
        public async Task<IActionResult> Delete(int? id)
        {
            if (id == null || pubrepository.Publish() == null)
            {
                return NotFound();
            }
 
            var publish = await pubrepository.Publish()
                .FirstOrDefaultAsync(m => m.Id == id);
            if (publish == null)
            {
                return NotFound();
            }
 
            return View(publish);
        }
 
        // POST: Publishes/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(int id)
        {
            if (pubrepository.Publish() == null)
            {
                return Problem("Entity set 'MvcMovieContext.Publish'  is null.");
            }
            var publish = await pubrepository.Publish().FindAsync(id);
            if (publish != null)
            {
                pubrepository.Remove(publish);
            }
 
            await pubrepository.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
    }
}
mvc/リポジトリパターン.1659016918.txt.gz · 最終更新: 2022/07/28 23:01 by ips