câu 1 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; namespace EmployeeManagement.Models { // Câu 1(4đ): Entity ViewCbac [Table("ViewCbac")] public class ViewCbac { [Key] [StringLength(20)] public string MaVienChuc { get; set; } [StringLength(100)] public string HoTen { get; set; } [StringLength(50)] public string DonVi { get; set; } public int? SoNgayCong { get; set; } [Column(TypeName = "decimal(18,2)")] public decimal? Luong { get; set; } [StringLength(50)] public string MaDonVi { get; set; } } // Câu 2(6đ): Entity NhanVien với ProAV [Table("NhanVien")] public class NhanVien { [Key] [StringLength(20)] public string MaNhanVien { get; set; } [Required] [StringLength(100)] public string HoTen { get; set; } [StringLength(200)] public string DiaChi { get; set; } public DateTime? NgaySinh { get; set; } [Column(TypeName = "decimal(18,2)")] public decimal? Luong { get; set; } [StringLength(50)] public string MaPhongBan { get; set; } // Navigation property [ForeignKey("MaPhongBan")] public virtual PhongBan PhongBan { get; set; } } // Entity PhongBan [Table("PhongBan")] public class PhongBan { [Key] [StringLength(50)] public string MaPhongBan { get; set; } [Required] [StringLength(100)] public string TenPhongBan { get; set; } // Navigation property public virtual ICollection NhanViens { get; set; } } // DbContext public class EmployeeDbContext : DbContext { public DbSet ViewCbacs { get; set; } public DbSet NhanViens { get; set; } public DbSet PhongBans { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer( @"Server=(localdb)\mssqllocaldb;Database=EmployeeManagementDB;Trusted_Connection=True;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Seed data cho PhongBan modelBuilder.Entity().HasData( new PhongBan { MaPhongBan = "PB001", TenPhongBan = "Phòng Kế toán" }, new PhongBan { MaPhongBan = "PB002", TenPhongBan = "Phòng Nhân sự" }, new PhongBan { MaPhongBan = "PB003", TenPhongBan = "Phòng Kinh doanh" }, new PhongBan { MaPhongBan = "PB004", TenPhongBan = "Phòng IT" } ); // Seed data cho ViewCbac modelBuilder.Entity().HasData( new ViewCbac { MaVienChuc = "VC001", HoTen = "Nguyễn Văn A", DonVi = "Phòng Kế toán", SoNgayCong = 22, Luong = 12000000, MaDonVi = "DV001" }, new ViewCbac { MaVienChuc = "VC002", HoTen = "Trần Thị B", DonVi = "Phòng Nhân sự", SoNgayCong = 20, Luong = 10000000, MaDonVi = "DV002" }, new ViewCbac { MaVienChuc = "VC003", HoTen = "Lê Văn C", DonVi = "Phòng Kinh doanh", SoNgayCong = 25, Luong = 15000000, MaDonVi = "DV003" } ); // Seed data cho NhanVien modelBuilder.Entity().HasData( new NhanVien { MaNhanVien = "NV001", HoTen = "Phạm Văn D", DiaChi = "Hà Nội", NgaySinh = new DateTime(1990, 5, 15), Luong = 11000000, MaPhongBan = "PB001" }, new NhanVien { MaNhanVien = "NV002", HoTen = "Hoàng Thị E", DiaChi = "Hồ Chí Minh", NgaySinh = new DateTime(1992, 8, 20), Luong = 13000000, MaPhongBan = "PB002" }, new NhanVien { MaNhanVien = "NV003", HoTen = "Vũ Văn F", DiaChi = "Đà Nẵng", NgaySinh = new DateTime(1988, 3, 10), Luong = 14000000, MaPhongBan = "PB003" } ); } } } câu 2 using System; using System.Linq; using System.Windows; using System.Windows.Controls; using EmployeeManagement.Models; using Microsoft.EntityFrameworkCore; namespace EmployeeManagement { public partial class NhanVienWindow : Window { private EmployeeDbContext _context; public NhanVienWindow() { InitializeComponent(); InitializeDatabase(); LoadPhongBan(); LoadData(); } private void InitializeDatabase() { _context = new EmployeeDbContext(); _context.Database.EnsureCreated(); } // 3.1: Hiển thị các ViewCbac trong DataGrid ngay khi hiện thị cửa sổ private void LoadData() { try { // Sử dụng LINQ để lấy dữ liệu với Include để load PhongBan var nhanVienList = _context.NhanViens .Include(nv => nv.PhongBan) .ToList(); dgNhanVien.ItemsSource = nhanVienList; // Hiển thị thông tin gồm: mã nhân viên, tên, mã phòng, lương, số ngày công txtThongTin.Text = $"Tổng số nhân viên: {nhanVienList.Count}"; } catch (Exception ex) { MessageBox.Show($"Lỗi khi tải dữ liệu: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // 3.2: Sử dụng combo box có tên đến từ bảng ProAV private void LoadPhongBan() { var phongBans = _context.PhongBans.ToList(); cboPhongBan.ItemsSource = phongBans; } // 3.3: Khi chọn 1 dòng dữ liệu trên DataGrid thì dữ liệu đó sẽ được điền vào các ô điều khiển private void DgNhanVien_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (dgNhanVien.SelectedItem is NhanVien selected) { txtMaNhanVien.Text = selected.MaNhanVien; txtHoTen.Text = selected.HoTen; txtDiaChi.Text = selected.DiaChi; dpNgaySinh.SelectedDate = selected.NgaySinh; txtLuong.Text = selected.Luong?.ToString() ?? ""; cboPhongBan.SelectedValue = selected.MaPhongBan; // Hiển thị thông tin của nhân viên được chọn txtThongTin.Text = $"Đã chọn: {selected.HoTen} - {selected.MaNhanVien} - " + $"Phòng: {selected.PhongBan?.TenPhongBan ?? "N/A"} - " + $"Lương: {selected.Luong:N0}"; } } // 3.4: Thêm 1 phần tử vào ProAV // Khi người dụng nhập qua các điều khiển, nhấn nút Thêm, dữ liệu đó sẽ được lưu vào ProAV private void BtnThem_Click(object sender, RoutedEventArgs e) { try { // Kiểm tra trùng mã var existing = _context.NhanViens.Find(txtMaNhanVien.Text); if (existing != null) { MessageBox.Show("Mã nhân viên đã tồn tại!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); return; } if (string.IsNullOrWhiteSpace(txtMaNhanVien.Text) || string.IsNullOrWhiteSpace(txtHoTen.Text)) { MessageBox.Show("Vui lòng nhập đầy đủ thông tin!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var newNhanVien = new NhanVien { MaNhanVien = txtMaNhanVien.Text, HoTen = txtHoTen.Text, DiaChi = txtDiaChi.Text, NgaySinh = dpNgaySinh.SelectedDate, Luong = decimal.TryParse(txtLuong.Text, out decimal luong) ? luong : (decimal?)null, MaPhongBan = cboPhongBan.SelectedValue?.ToString() }; _context.NhanViens.Add(newNhanVien); _context.SaveChanges(); // Khi thêm xong phần tử mới này vào danh sách ProAV // thì nó được điền vào hàng mới nhất (mới thêm) vào DataGrid LoadData(); MessageBox.Show("Thêm nhân viên thành công!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); ClearInputs(); } catch (Exception ex) { MessageBox.Show($"Lỗi khi thêm: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // 3.5: Nhập vào phần tử cần tìm trong Textbox // Sau đó nhấn nút Thêm, dữ liệu đó được lấy ra đưa vào các ô điều khiển // Đồng thời khi tìm thấy dữ liệu thì được điền vào DataGrid private void BtnTimKiem_Click(object sender, RoutedEventArgs e) { try { string searchTerm = txtTimKiem.Text.Trim(); if (string.IsNullOrWhiteSpace(searchTerm)) { MessageBox.Show("Vui lòng nhập thông tin cần tìm!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); return; } // Tìm kiếm theo tên nhân viên hoặc tên phòng ban bằng LINQ var result = _context.NhanViens .Include(nv => nv.PhongBan) .Where(nv => nv.HoTen.Contains(searchTerm) || nv.PhongBan.TenPhongBan.Contains(searchTerm)) .ToList(); if (result.Count == 0) { MessageBox.Show("Không tìm thấy!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); LoadData(); // Hiển thị lại toàn bộ } else { // Điền vào DataGrid dgNhanVien.ItemsSource = result; // Nếu tìm thấy 1 kết quả, tự động chọn và điền vào các ô điều khiển if (result.Count == 1) { dgNhanVien.SelectedItem = result[0]; } txtThongTin.Text = $"Tìm thấy {result.Count} kết quả cho '{searchTerm}'"; } } 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(); txtTimKiem.Clear(); } // Xóa nhân viên private void BtnXoa_Click(object sender, RoutedEventArgs e) { try { if (dgNhanVien.SelectedItem is NhanVien selected) { var result = MessageBox.Show( $"Bạn có chắc chắn muốn xóa nhân viên '{selected.HoTen}'?", "Xác nhận xóa", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { _context.NhanViens.Remove(selected); _context.SaveChanges(); LoadData(); ClearInputs(); MessageBox.Show("Xóa nhân viên thành công!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); } } else { MessageBox.Show("Vui lòng chọn nhân viên cần xóa!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); } } catch (Exception ex) { MessageBox.Show($"Lỗi khi xóa: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Sửa nhân viên private void BtnSua_Click(object sender, RoutedEventArgs e) { try { if (dgNhanVien.SelectedItem is NhanVien selected) { var toUpdate = _context.NhanViens.Find(selected.MaNhanVien); if (toUpdate != null) { toUpdate.HoTen = txtHoTen.Text; toUpdate.DiaChi = txtDiaChi.Text; toUpdate.NgaySinh = dpNgaySinh.SelectedDate; toUpdate.Luong = decimal.TryParse(txtLuong.Text, out decimal luong) ? luong : (decimal?)null; toUpdate.MaPhongBan = cboPhongBan.SelectedValue?.ToString(); _context.SaveChanges(); LoadData(); MessageBox.Show("Cập nhật nhân viên thành công!", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information); } } else { MessageBox.Show("Vui lòng chọn nhân viên cần sửa!", "Cảnh báo", MessageBoxButton.OK, MessageBoxImage.Warning); } } catch (Exception ex) { MessageBox.Show($"Lỗi khi cập nhật: {ex.Message}", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error); } } // Làm mới form private void BtnLamMoi_Click(object sender, RoutedEventArgs e) { ClearInputs(); LoadData(); txtTimKiem.Clear(); } private void ClearInputs() { txtMaNhanVien.Clear(); txtHoTen.Clear(); txtDiaChi.Clear(); dpNgaySinh.SelectedDate = null; txtLuong.Clear(); cboPhongBan.SelectedIndex = -1; dgNhanVien.SelectedItem = null; txtThongTin.Text = ""; } protected override void OnClosed(EventArgs e) { base.OnClosed(e); _context?.Dispose(); } } }