using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; namespace BookManagement.Models { // Entity: Sach (Book) public class Sach { [Key] [StringLength(50)] public string MaSach { get; set; } [Required] [StringLength(200)] public string TenSach { get; set; } [StringLength(50)] public string MaTacGia { get; set; } public int? SoTrang { get; set; } [Column(TypeName = "decimal(18,2)")] public decimal? GiaSach { get; set; } // Navigation property [ForeignKey("MaTacGia")] public virtual TacGia TacGia { get; set; } } // Entity: TacGia (Author) public class TacGia { [Key] [StringLength(50)] public string MaTacGia { get; set; } [Required] [StringLength(100)] public string TenTacGia { get; set; } // Navigation property public virtual ICollection Sachs { get; set; } } // DbContext public class BookDbContext : DbContext { public DbSet Sachs { get; set; } public DbSet TacGias { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // Cấu hình connection string optionsBuilder.UseSqlServer( @"Server=(localdb)\mssqllocaldb;Database=BookManagementDB;Trusted_Connection=True;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Seed data cho TacGia modelBuilder.Entity().HasData( new TacGia { MaTacGia = "TG001", TenTacGia = "Nguyễn Nhật Ánh" }, new TacGia { MaTacGia = "TG002", TenTacGia = "Tô Hoài" }, new TacGia { MaTacGia = "TG003", TenTacGia = "Nam Cao" } ); // Seed data cho Sach modelBuilder.Entity().HasData( new Sach { MaSach = "S001", TenSach = "Cho Tôi Xin Một Vé Đi Tuổi Thơ", MaTacGia = "TG001", SoTrang = 250, GiaSach = 70000 }, new Sach { MaSach = "S002", TenSach = "Dế Mèn Phiêu Lưu Ký", MaTacGia = "TG002", SoTrang = 180, GiaSach = 50000 }, new Sach { MaSach = "S003", TenSach = "Lão Hạc", MaTacGia = "TG003", SoTrang = 120, GiaSach = 35000 } ); } } } //////// câu 2 using System; using System.Linq; using System.Windows; using System.Windows.Controls; using BookManagement.Models; using Microsoft.EntityFrameworkCore; namespace BookManagement { public partial class MainWindow : Window { private BookDbContext _context; public MainWindow() { InitializeComponent(); InitializeDatabase(); LoadTacGia(); LoadData(); } // Khởi tạo database private void InitializeDatabase() { _context = new BookDbContext(); _context.Database.EnsureCreated(); } // Load danh sách tác giả vào ComboBox private void LoadTacGia() { var tacGias = _context.TacGias.ToList(); cboTacGia.ItemsSource = tacGias; } // Câu 2.1: Hiển thị danh sách tất cả sách (LINQ) private void LoadData() { try { // Sử dụng LINQ để lấy dữ liệu var sachList = from s in _context.Sachs select s; dgSach.ItemsSource = sachList.ToList(); } catch (Exception ex) { MessageBox.Show($"Lỗi khi tải dữ liệu: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Câu 2.2: Sử dụng combo box hiển thị tên tác giả bằng TacGia (đã thực hiện trong LoadTacGia) // Câu 2.3: Khi chọn 1 dòng dữ liệu trên DataGrid -> điền vào các ô điều khiển private void DgSach_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (dgSach.SelectedItem is Sach selectedSach) { txtMaSach.Text = selectedSach.MaSach; txtTenSach.Text = selectedSach.TenSach; cboTacGia.SelectedValue = selectedSach.MaTacGia; txtSoTrang.Text = selectedSach.SoTrang?.ToString() ?? ""; txtGiaSach.Text = selectedSach.GiaSach?.ToString() ?? ""; } } // Câu 2.4: Thêm 1 bản ghi vào bảng Sach private void BtnThem_Click(object sender, RoutedEventArgs e) { try { // Kiểm tra không cho thêm sách trùng mã (có hộp thoại cảnh báo) var existingSach = _context.Sachs.Find(txtMaSach.Text); if (existingSach != null) { MessageBox.Show("Mã sách đã tồn tại!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); return; } // Kiểm tra dữ liệu đầu vào if (string.IsNullOrWhiteSpace(txtMaSach.Text) || string.IsNullOrWhiteSpace(txtTenSach.Text)) { MessageBox.Show("Vui lòng nhập đầy đủ thông tin!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var newSach = new Sach { MaSach = txtMaSach.Text, TenSach = txtTenSach.Text, MaTacGia = cboTacGia.SelectedValue?.ToString(), SoTrang = int.TryParse(txtSoTrang.Text, out int soTrang) ? soTrang : (int?)null, GiaSach = decimal.TryParse(txtGiaSach.Text, out decimal giaSach) ? giaSach : (decimal?)null }; _context.Sachs.Add(newSach); _context.SaveChanges(); // Hiển thị lại dữ liệu sau khi thêm trong DataGrid LoadData(); MessageBox.Show("Thêm sách thành công!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); ClearInputs(); } catch (Exception ex) { MessageBox.Show($"Lỗi khi thêm sách: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Câu 2.5: Nhập vào mã sách cần tìm trong Textbox private void BtnTim_Click(object sender, RoutedEventArgs e) { try { string searchTerm = txtMaSach.Text.Trim(); if (string.IsNullOrWhiteSpace(searchTerm)) { MessageBox.Show("Vui lòng nhập mã sách cần tìm!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); return; } // Sử dụng LINQ để tìm kiếm var result = from s in _context.Sachs where s.MaSach.Contains(searchTerm) || s.TenSach.Contains(searchTerm) select s; var sachList = result.ToList(); if (sachList.Count == 0) { MessageBox.Show("Không tìm thấy sách!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); } else { dgSach.ItemsSource = sachList; // Sau đó nhập được lên DataGrid MessageBox.Show($"Tìm thấy {sachList.Count} kết quả!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); } } catch (Exception ex) { MessageBox.Show($"Lỗi khi tìm kiếm: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Hiển thị tất cả private void BtnHienThi_Click(object sender, RoutedEventArgs e) { LoadData(); } // Xóa sách private void BtnXoa_Click(object sender, RoutedEventArgs e) { try { if (dgSach.SelectedItem is Sach selectedSach) { var result = MessageBox.Show( $"Bạn có chắc chắn muốn xóa sách '{selectedSach.TenSach}'?", "Xác nhận xóa", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { _context.Sachs.Remove(selectedSach); _context.SaveChanges(); LoadData(); ClearInputs(); MessageBox.Show("Xóa sách thành công!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); } } else { MessageBox.Show("Vui lòng chọn sách cần xóa!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); } } catch (Exception ex) { MessageBox.Show($"Lỗi khi xóa sách: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Sửa sách private void BtnSua_Click(object sender, RoutedEventArgs e) { try { if (dgSach.SelectedItem is Sach selectedSach) { var sachToUpdate = _context.Sachs.Find(selectedSach.MaSach); if (sachToUpdate != null) { sachToUpdate.TenSach = txtTenSach.Text; sachToUpdate.MaTacGia = cboTacGia.SelectedValue?.ToString(); sachToUpdate.SoTrang = int.TryParse(txtSoTrang.Text, out int soTrang) ? soTrang : (int?)null; sachToUpdate.GiaSach = decimal.TryParse(txtGiaSach.Text, out decimal giaSach) ? giaSach : (decimal?)null; _context.SaveChanges(); LoadData(); MessageBox.Show("Cập nhật sách thành công!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); } } else { MessageBox.Show("Vui lòng chọn sách cần sửa!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); } } catch (Exception ex) { MessageBox.Show($"Lỗi khi sửa sách: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Làm mới form private void BtnLamMoi_Click(object sender, RoutedEventArgs e) { ClearInputs(); LoadData(); } // Xóa các ô nhập liệu private void ClearInputs() { txtMaSach.Clear(); txtTenSach.Clear(); cboTacGia.SelectedIndex = -1; txtSoTrang.Clear(); txtGiaSach.Clear(); dgSach.SelectedItem = null; } protected override void OnClosed(EventArgs e) { base.OnClosed(e); _context?.Dispose(); } } }