Blog của Lê Văn Luật

Đời người thì có hạn mà sự học thì vô hạn!

WPF: Sử dụng Entity framework Code first với CSDL SQL Server có sẵn

Entity Framework là một bộ ánh xạ đối tượng – quan hệ cho phép người lập trình .NET  làm việc với dữ liệu quan hệ qua các đối tượng (object) nó giúp lập trình viên không cần viết mã cho (hầu hết) những gì liên quan đến truy cập dữ liệu. Có thể tham khảo thêm tại đây.

Trong Entity Framework:
+ Code là mã lệnh tạo thành các lớp đối tượng dữ liệu cho phép thao tác với dữ liệu.
+ Model là sơ đồ gồm các hộp mô tả các thực thể và các đường nối kết mô tả các quan hệ.
+ Database là cơ sở dữ liệu (có thể là SQL Server, Compact SQL Server, Local database, MySQL, Oracle,…)

Có 3 cách sử dụng Entity Framework (EF): Database FirstModels First và Code First.


Nguồn: yinyangit.wordpress.com

Theo khuyến cáo của Microsoft:
+ Database first: là phương pháp chỉ nên dùng khi ta đã có sẵn CSDL (không phải tạo), EF Wizard sẽ tạo Model và Code cho ta.
+ Model first: nên dùng khi ta bắt đầu thiết kế CSDL từ đầu (từ chưa có gì). Ta sẽ thiết kế mô hình CSDL (Model) EF sẽ tự tạo code cho ta, sau đó nhờ EF Wizard tạo CSDL.
+ Code first: nên dùng khi đã có mô hình CSDL, ta sẽ chỉ viết code từ đó tạo Database.

Dù cách nào thì cuối cùng cũng phải có Code để thao tác trong mã lệnh và Database để lưu trữ dữ liệu. Model chỉ là một thành phần trung gian.

Theo kinh nghiệm của nhiều lập trình viên đi trước, Code First là phương án mềm dẻo nhất (hơi mất công ngồi gõ code, tuy nhiên nếu dùng tốt code snippets thì đỡ nhiều).

Trước đây khi lập trình CSDL trong VB, VC,… ta luôn tạo CSDL liệu trước, sau đó mới xây dựng mã lệnh truy cập dữ liệu.

Trong bài này tôi giới thiệu cách dùng Code first với CSDL có sẵn.

Tạo dữ liệu thử

Mô hình CSDL như sau:

ef01

Mã lệnh T-SQL tạo CSDL dữ liệu và dữ liệu thử trong SQL Server:

create database TestEF;
go

-- Tạo các bảng
if object_id(N'dbo.DonVi', N'U') is null
	create table DonVi(
		DV int identity(1,1) primary key,
		DVTen nvarchar(200) not null,
		DVBo bit default(0) not null
	)
else
	delete from DonVi;

if object_id(N'dbo.NhanVien', N'U') is null
	create table NhanVien(
		NV int identity(1,1) primary key,
		NVHo nvarchar(50) not null,
		NVTen nvarchar(10) not null,
		NVNgaySinh date,
		NVGioiTinh bit default(0),
		DV int references DonVi(DV),
		NVCu bit default(0) not null
	)
else
	delete from NhanVien;

-- Tạo dữ liệu thử

insert into DonVi(DVTen) values(N'Phòng Kế toán');
insert into DonVi(DVTen) values(N'Phòng Nhân sự');
insert into DonVi(DVTen) values(N'Phòng Kinh doanh');

insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Trần Văn', N'Tuấn', '1975-5-23', 0, 1);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Nguyễn Thị', N'Hoa', '1984-3-13', 1, 1);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Nguyễn Minh', N'Nhàn', '1978-7-29', 1, 1);

insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Đặng Văn', N'Nam', '1980-3-21', 0, 2);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Nguyễn Thành', N'Trung', '1978-10-20', 0, 2);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Hồ Thị', N'Thanh', '1982-12-12', 1, 2);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Lê Văn', N'Tuấn', '1981-10-18', 0, 2);

insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Nguyễn Văn', N'Minh', '1985-12-21', 0, 3);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Trần Văn', N'Kha', '1976-9-17', 0, 3);
insert into NhanVien(NVHo, NVTen, NVNgaySinh, NVGioiTinh, DV) values (N'Đỗ Thị', N'Lan', '1983-4-26', 0, 3);

Các bước thực hiện trong Visual Studio 2012:

1. Tạo project

2. Cài EF Power Tools vào Visual Studio: Tools -> Library Paskage Manager -> Manage NuGet Packages for Solution…

ef02

Màn hình sau xuất hiện:

ef03

Bến trái, chọn Online. Nhập Entity Framework Power Tools vào khung Search (góc trên, bên phải) chọn Entity Framework Power Tools -> Install. Cũng có thể download trực tiếp Entity Framework Power Tools tại đây và nhắp đúp đề cài vào Visual Studio.

Khi đã cài được, bạn chuột phải trên tên Project sẽ thấy có menu Entity Framework.

3. Tạo code từ CSDL có sẵn

Chuột phải trên tên project -> chọn Entity Framework -> Reverse Engineer Code First

ef11

Màn hình sau xuất hiện:

ef12

Chọn Server và tên CSDL đã có -> Ok.

Nhìn trên Solution Explorer sẽ thấy có thêm folder Models trong đó có các class và mapping do EF đã tự tạo.

ef13

4. Sử dụng dữ liệu

Để ví dụ việc sử dụng dữ liệu, ta thực hiện window như sau:

ef14

Mã XAML của window trên như sau:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Models="clr-namespace:testEFCodeFirstWithExistingDB.Models"
        mc:Ignorable="d" x:Class="testEFCodeFirstWithExistingDB.MainWindow"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid Name="dgrDonVi" ItemsSource="{Binding}" Grid.Row="0" SelectionMode="Single"/>
        <DataGrid Name="dgrNhanVien" Grid.Row="1" ItemsSource="{Binding SelectedItem.NhanViens, ElementName=dgrDonVi}"/>
        <Button Name="btnSave" Content="Lưu" Grid.Row="2" HorizontalAlignment="Center" Width="100" Height="30" Click="btnSave_Click_1"/>
    </Grid>
</Window>

Code

using System.Windows;
using System.Data.Entity;
using testEFCodeFirstWithExistingDB.Models;

namespace testEFCodeFirstWithExistingDB
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        TestEFContext data;
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            data = new TestEFContext();
            data.DonVis.Load();
            dgrDonVi.DataContext = data.DonVis.Local;
        }

        private void btnSave_Click_1(object sender, RoutedEventArgs e)
        {
            data.SaveChanges();
        }
    }
}

Lưu ý:
+ Phương thức Load() để nạp dữ liệu. Phải có using System.Data.Entity mới có phương thức này (nó là extension method).
+ Trong WPF, không bind trực tiếp DataContext hoặc ItemsSource = data.DonVis. Phải thông qua thuộc tính Local. Trong WinForm dùng ToList để bind: data.DonVis.ToList().

Advertisements

7 comments on “WPF: Sử dụng Entity framework Code first với CSDL SQL Server có sẵn

  1. TikTak
    22/11/2013

    bạn ơi mình đã cài Entity rồi mà sao click phải lên Project ko có mục “ENTITY” như của bạn

    • lvluat
      25/11/2013

      Thực sự là tôi không rõ vì sao. Bạn kiểm tra lại xem trong folder Reference có EntityFramework chưa, trong file packages.config có EntityFramework không?

  2. yoraky99
    10/04/2014

    Bạn ơi, cái hình cuối bước 3, sao mình không thấy cái foder Mapping nhỉ. Cũng không có các class Donvi hay Nhanvien, trong Models chỉ hiện ra class TestEFContext.cs thôi 😦

  3. yoraky99
    10/04/2014

    Bạn có thể cho mình xin source đươc không, tuần này mình phải seminar giữa kỳ về CodeFirst mà chưa làm ra được cái ví dụ này.

    • lvluat
      14/04/2014

      Rất tiếc là tôi không tìm thấy được source vì đã làm lâu rồi.
      Trước hết bạn kiểm tra lại để chắc chắn đã cài EntityFramework.
      Nếu không thấy Donvi, Nhanvien và folder Mapping thì bạn kiểm tra xem trong CSDL (trong SQl Server) bạn đã tạo đầy đủ các bảng,….

  4. cho hỏi sao mà khi load một bảng nào đó lên thì lâu thế nhỉ cỡ 7 ,8 giây ?

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

Information

This entry was posted on 22/05/2013 by in Lập trình C# & WPF and tagged , , .

Điều hướng

%d bloggers like this: