Code First là gì?

Entity Framework vẫn ra mắt giải pháp tiếp cận Code First trong Entity Framework 4.1. Code First đa phần có lợi trong Thiết kế phía tên miền.

Bạn đang xem: Entity framework code first là gì

Trong biện pháp tiếp cận Code First, bạn triệu tập vào miền của ứng dụng cùng bắt đầu tạo những lớp đến thực thể miền cầm cố bởi xây cất đại lý dữ liệu trước rồi tạo nên những lớp khớp với xây cất đại lý dữ liệu của bạn. Hình dưới đây minh họa giải pháp tiếp cận Code First.

*

Như chúng ta có thể thấy vào hình trên, Entity Framework API sẽ tạo nên cơ sở dữ liệu dựa trên cấu hình cùng những lớp miền của người tiêu dùng. Vấn đề này Tức là bạn cần bước đầu viết code trước bởi C# hoặc VB.NET và sau đó Entity Framework (EF) sẽ tạo nên cửa hàng tài liệu tự code của doanh nghiệp.

Quy trình làm việc cùng với Code First

Hình dưới đây minh họa các bước phát triển Code First.

*

Quy trình cách tân và phát triển theo cách tiếp cận Code First đang là: Tạo hoặc sửa đổi những lớp miền -> thông số kỹ thuật các lớp miền này bởi những trực thuộc tính chú giải dữ liệu hoặc Fluent API -> Tạo hoặc cập nhật lược đồ vật đại lý tài liệu bằng automated migration hoặc code-based migration.

Các quy ước vào Code First

Các quy ước là các cỗ luật lệ khoác định tự động hóa thông số kỹ thuật một quy mô quan niệm dựa trên các lớp miền của khách hàng lúc thao tác làm việc với bí quyết tiếp cận Code First.

Như các bạn đang thấy trong ví dụ ở bên trên, Entity Framework API đã cấu hình các khóa chủ yếu, khóa ngoại, các quan hệ, đẳng cấp dữ liệu của cột, v.v. tự các lớp miền mà không bắt buộc cấu hình bổ sung.

Vấn đề này là vì những quy ước của Entity Framework Code First. Nếu các lớp miền của người sử dụng tuân thủ theo đúng những quy ước thì lược đồ dùng cửa hàng dữ liệu sẽ được thông số kỹ thuật dựa vào các quy ước này.

Các quy ước vào Entity Framework 6.x Code First được khái niệm vào namespace System.Data.Entity.ModelConfiguration.Conventions .

Bảng sau liệt kê các quy ước mặc định của Code First:


Quy ướcMiêu tả
Lược đồTheo mặc định, EF chế tạo ra toàn bộ những đối tượng người sử dụng DB vào lược trang bị dbo .
Tên bảng + "s" EF sẽ khởi tạo bảng DB với tên lớp thực thể thêm "s" sinh sống cuối, ví dụ: lớp Student đã ánh xạ cho tới bảng Students.
Tên khóa chủ yếu 1) Id 2) + "Id" (ko minh bạch chữ hoa chữ thường) EF sẽ khởi tạo cột khóa thiết yếu mang lại nằm trong tính có tên Id hoặc + "Id" (không tách biệt chữ hoa chữ thường).
Tên khóa nước ngoài Theo mang định, EF sẽ kiếm tìm trực thuộc tính khóa nước ngoài bao gồm cùng tên cùng với thương hiệu khóa chính của thực thể chủ yếu.Nếu thuộc tính khóa nước ngoài không vĩnh cửu, thì EF sẽ tạo nên cột khóa nước ngoài trong bảng Db cùng với + "_" + ví dụ: EF sẽ tạo nên cột khóa nước ngoài Grade_GradeId trong bảng Students giả dụ thực thể Student không đựng thuộc tính khóa ngoại mang lại Grade.
Cột Null EF tạo một cột null mang đến toàn bộ các thuộc tính phong cách tsi mê chiếu với những trực thuộc tính hình trạng nguyên ổn tdiệt nullable, ví dụ: string, Nullable , Student, Grade (tất cả các nằm trong tính giao diện lớp)
Cột Not Null EF tạo các cột Not Null cho những nằm trong tính khóa bao gồm và các trực thuộc tính thứ hạng quý giá không nullable, ví dụ: int, float, binary, datetime, v.v.
Thứ đọng từ cột EF sẽ tạo các cột theo cùng thiết bị từ bỏ nhỏng các trực thuộc tính vào một tờ thực thể. Tuy nhiên, các cột khóa thiết yếu sẽ được di chuyển lên trước tiên.
Ánh xạ nằm trong tính vào DB Theo mặc định, tất cả những trực thuộc tính vẫn ánh xạ cho tới cửa hàng tài liệu. Sử dụng trực thuộc tính nhằm loại bỏ nằm trong tính hoặc lớp không ánh xạ vào DB.
Cascade deleteĐược bật theo mang định cho toàn bộ các nhiều loại mối quan hệ.

Bảng sau liệt kê loại dữ liệu C# được ánh xạ với loại tài liệu SQL Server.


Kiểu tài liệu C#Ánh xạ cho tới thứ hạng dữ liệu SQL Server
intint
stringnvarchar(Max)
decimaldecimal(18,2)
floatreal
byte<>varbinary(Max)
datetimedatetime
boolbit
bytetinyint
shortsmallint
longbigint
doublefloat
charKhông ánh xạ
sbyteKhông ánh xạ (nỉm ra exception)
objectKhông ánh xạ

Hình sau đây minc họa ánh xạ quy ước với đại lý dữ liệu.

*

Quy ước về mọt quan lại hệ

Entity Framework 6 chế tạo mối quan hệ một-nhiều bằng cách áp dụng trực thuộc tính điều hướng theo quy ước mặc định. Phần này sẽ được trình diễn chi tiết trong bài viết khác.

Lưu ý: Entity Framework 6 không tồn tại những quy ước mang định cho các mối quan hệ một-một và nhiều-nhiều. Quý khách hàng phải cấu hình chúng bởi Fluent API hoặc DataAnnotation.

Quy ước hình trạng phức tạp

Code First tạo ra kiểu dáng tinh vi đến lớp không bao hàm nằm trong tính khóa và khóa chủ yếu ko được đăng ký bằng ở trong tính DataAnnotation hoặc Fluent API.

Phần này trình bày tổng quan lại về các quy ước vào Code First. Các quy ước này rất có thể được ghi đè cổ bằng các sử dụng thuộc tính DataAnnotation hoặc Fluent API.

Khởi tạo nên cửa hàng dữ liệu trong Code First

Tại phần này, bọn họ đã khám phá cách Entity Framework quyết định tên cửa hàng dữ liệu và sever trong lúc khởi chế tạo ra đại lý tài liệu Theo phong cách tiếp cận Code First.

Hình tiếp sau đây cho biết thêm một quá trình khởi tạo ra cửa hàng dữ liệu, dựa trên tham mê số được truyền trong cách tiến hành khởi tạo nên cơ sở của lớp Context được thừa kế trường đoản cú lớp DbContext:

*

Tmê man số khởi chế tạo ra các đại lý dữ liệu

Theo hình trên, cách làm khởi chế tạo cơ sở của lớp Context có thể có tmê say số sau:

Không tất cả tmê mệt số.Tên cửa hàng tài liệu.Tên chuỗi liên kết.

Không gồm ttê mê số

Nếu bạn không chỉ là định tđam mê số vào cách tiến hành khởi sinh sản cơ sở của lớp Context thì nó sẽ khởi tạo cơ sở dữ liệu vào máy chủ SQLEXPRESS toàn bộ của người tiêu dùng với thương hiệu khớp cùng với Namespace. Tên lớp Context.

lấy ví dụ, Entity Framework (EF) sẽ khởi tạo một đại lý tài liệu có tên SchoolDataLayer.Context mang đến lớp Context sau:

namespace SchoolDataLayer public class Context: DbContext public Context(): base() Tên các đại lý dữ liệu

Bạn cũng hoàn toàn có thể chỉ định và hướng dẫn tên cửa hàng tài liệu làm cho tsi số vào cách làm khởi tạo nên cơ sở của lớp Context.

Nếu các bạn hướng đẫn tđam mê số tên các đại lý dữ liệu, thì Code First sẽ khởi tạo cơ sở dữ liệu với tên bạn đã chỉ định trong phương thức khởi chế tạo ra cửa hàng vào máy chủ các đại lý tài liệu SQLEXPRESS tổng thể.

lấy ví dụ như, Code First sẽ tạo nên đại lý tài liệu có tên MySchoolDB cho lớp Context sau.

namespace SchoolDataLayer public class Context: DbContext public Context(): base("MySchoolDB") Tên chuỗi kết nối

Bạn cũng hoàn toàn có thể chỉ định chuỗi liên kết trong app.config hoặc website.config và hướng đẫn thương hiệu chuỗi kết nối ban đầu bởi "name =" trong thủ tục khởi tạo các đại lý của lớp Context.

Hãy cẩn thận ví dụ sau nơi bọn họ truyền tmê man số name=SchoolDBConnectionString vào cách thức khởi tạo cửa hàng.

namespace SchoolDataLayer public class Context: DbContext public SchoolDBContext() : base("name=SchoolDBConnectionString") App.config:

Trong lớp Context sống trên, công ty chúng tôi chỉ định thương hiệu chuỗi kết nối có tác dụng ttê mê số. Xin để ý rằng tên chuỗi liên kết buộc phải bắt đầu bởi "name =", nếu như không, nó đang coi nó là tên gọi cửa hàng dữ liệu.

Tên cơ sở dữ liệu trong chuỗi kết nối vào App.config là SchoolDB. Entity Framework (EF) sẽ tạo nên cửa hàng tài liệu SchoolDB bắt đầu hoặc thực hiện đại lý tài liệu SchoolDB hiện tại tất cả vào SQL Server toàn cục.

Đảm nói rằng chúng ta bao gồm ở trong tính providerName="System.Data.SqlClient" mang lại các đại lý dữ liệu SQL Server trong chuỗi liên kết.

Chiến lược khởi sinh sản các đại lý dữ liệu

Quý khách hàng vẫn chế tạo cửa hàng tài liệu sau khi chạy vận dụng Code First lần đầu tiên, dẫu vậy lần trang bị hai trnghỉ ngơi đi thì sao? Nó sẽ tạo ra một các đại lý dữ liệu bắt đầu từng khi chúng ta chạy ứng dụng?

Còn môi trường Production thì sao? Làm nỗ lực nào nhằm các bạn update đại lý tài liệu khi bạn biến đổi quy mô miền của bạn?

Để giải pháp xử lý các kịch bản này, các bạn đề xuất sử dụng một trong những chiến lược khởi tạo thành các đại lý dữ liệu.

Có bốn kế hoạch khởi sản xuất các đại lý dữ liệu khác nhau vào Code First:

CreateDatabaseIfNotExists: Đây là trình khởi tạo ra mang định. Nlỗi tên gọi, nó sẽ khởi tạo các đại lý tài liệu nếu như không trường thọ theo thông số kỹ thuật. Tuy nhiên, nếu bạn chuyển đổi lớp mô hình với kế tiếp chạy ứng dụng với trình khởi tạo này, thì nó đang chỉ dẫn một nước ngoài lệ.DropCreateDatabaseIfModelChanges: Trình khởi chế tạo này xóa cửa hàng dữ liệu hiện nay gồm với tạo thành cửa hàng dữ liệu mới, nếu như các lớp mô hình của khách hàng (những lớp thực thể) đã biết thành thay đổi. Vì vậy, bạn không phải băn khoăn lo lắng về bài toán bảo trì lược thứ cửa hàng tài liệu của mình, Khi những lớp quy mô của bạn biến đổi.DropCreateDatabaseAlways: Nhỏng tên cho biết thêm, trình khởi sinh sản này đã xóa cửa hàng tài liệu hiện nay bao gồm mỗi khi chúng ta chạy vận dụng, bất cứ những lớp quy mô của công ty bao gồm thay đổi hay không. Như vậy sẽ hữu dụng lúc bạn có nhu cầu tất cả một cơ sở tài liệu bắt đầu mỗi khi bạn chạy áp dụng, ví như khi chúng ta sẽ cải cách và phát triển vận dụng.Trình khởi tạo nên cơ sở dữ liệu tùy chỉnh: quý khách hàng cũng có thể tạo thành trình khởi sinh sản thiết lập cấu hình của riêng biệt mình, nếu những phương pháp trên ko thỏa mãn nhu cầu hưởng thụ của doanh nghiệp hoặc bạn muốn triển khai một số tiến trình khác để tạo cửa hàng dữ liệu bằng trình khởi sản xuất sinh hoạt trên.
Cách Code First auto khởi sản xuất cửa hàng dữ liệu trong Entity Framework. Các chiến lược khởi tạo nên đại lý dữ liệu vào EF.
Trung Nguyendiyxaqaw.com
*

Chiến lược thừa kế trong Code First

Quý khách hàng rất có thể thi công những lớp thực thể của bản thân mình bằng phương pháp thực hiện tính kế thừa trong C#.

Trong xây dựng phía đối tượng, các lớp có mối quan hệ "has a" cùng "is a", trong những lúc kia mô hình quan hệ dựa trên SQL chỉ tất cả quan hệ "has a" thân các bảng.

Hệ quản trị cơ sở dữ liệu Squốc lộ không cung ứng quan hệ "is a". Vì vậy, làm cho nuốm nào chúng ta có thể ánh xạ những lớp thực thể bao gồm mối quan hệ "is a" vào cửa hàng dữ liệu quan hệ?

Dưới đấy là tía biện pháp tiếp cận khác biệt nhằm ánh xạ kế thừa vào đại lý tài liệu vào Code First:

Table per Hierarchy (TPH): Cách tiếp cận này đề xuất tạo một bảng tầm thường đến toàn thể các lớp trong phân cấp cho thừa kế. Bảng này còn có một cột để phân biệt thân các lớp nhỏ. Đây là một kế hoạch ánh xạ kế thừa mang định trong Entity Framework.Table per Type (TPT): Cách tiếp cận này đề nghị chế tác mỗi bảng cho từng phần bên trong phân cung cấp kế thừa (tạo nên bảng cho cả lớp phụ vương và lớp con).Table per Concrete Class (TPC): Cách tiếp cận này kiến nghị chế tạo từng bảng mang lại từng lớp nhỏ vào phân cấp cho kế thừa, dẫu vậy ko sản xuất bảng mang đến lớp phụ thân. Vì vậy những trực thuộc tính của lớp cha sẽ là một phần của mỗi bảng của lớp bé.

Xem chi tiết bố phương pháp tiếp cạn để anh xạ thừa kế vào đại lý tài liệu trong Code First:


Trung Nguyendiyxaqaw.com
*

Cấu hình những phần trong Entity Framework

Code First phát hành quy mô có mang từ những lớp thực thể của công ty bằng phương pháp áp dụng các quy ước mặc định.

EF 6 Code First tận dụng một chủng loại thiết kế được hotline là quy ước về cấu hình. Tuy nhiên, chúng ta cũng có thể ghi đè các quy ước này bằng cách cấu hình các lớp thực thể của người sử dụng để cung cấp mang lại EF báo cáo quan trọng.

Có hai phương pháp để thông số kỹ thuật các lớp thực thể của bạn:

Attribute ghi chú dữ liệu.Fluent API.

Attribute ghi chú dữ liệu

Chụ yêu thích dữ liệu là một trong cấu hình dựa trên attribute dễ dàng và đơn giản, chúng ta có thể vận dụng cho các lớp cùng ở trong tính của chính nó.

Các attribute này không chỉ là giành riêng cho EF mà còn được áp dụng trong ASP..NET Web Form cùng ASPhường.NET MVC. Do đó, chúng được đặt trong một namespace lẻ tẻ là System.ComponentModel.DataAnnotations.

lấy ví dụ sau đây minh họa câu hỏi thực hiện một vài attribute ghi chú dữ liệu:

public class Student public Student() public int SID get; set; public string StudentName get; set; public int? Age get; set; public int StdId get; set; public virtual Standard Standard get; set; Lưu ý: Attribute ghi chú tài liệu ko cung ứng toàn bộ những tùy lựa chọn thông số kỹ thuật mang lại Entity Framework. Vì vậy, chúng ta có thể thực hiện Fluent API, nó cung ứng toàn bộ các tùy chọn cấu hình đến EF.Tìm đọc cụ thể về attribute ghi chú tài liệu trong Entity Framework trên bài viết này:


Trung Nguyendiyxaqaw.com

Fluent API

Một bí quyết khác để định cấu hình những lớp là bằng phương pháp sử dụng Entity Framework Fluent API. Fluent API dựa trên chủng loại thi công Fluent API (hay có cách gọi khác là hình ảnh thông thạo) trong số ấy công dụng được chế tạo thành xuất phát điểm từ một chuỗi cách thức.

Cấu hình Fluent API có thể được áp dụng Khi EF thiết kế mô hình tự các lớp thực thể của khách hàng. quý khách hàng có thể thêm các thông số kỹ thuật Fluent API bằng cách ghi đnai lưng cách thức OnModelCreating của lớp DbContext trong Entity Framework 6.x, nhỏng được trình diễn bên dưới:

public class SchoolDBContext: DbContext public SchoolDBContext(): base("SchoolDBConnectionString") public DbSet Students get; set; public DbSet Standards get; set; public DbSet StudentAddress get; set; protected override void OnModelCreating(DbModelBuilder modelBuilder) //Configure tên miền classes using modelBuilder here.. Quý khách hàng rất có thể thực hiện tsi số modelBuilder, một đối tượng người tiêu dùng của lớp DbModelBuilder để cấu hình các lớp thực thể của người tiêu dùng. DbModelBuilder được call là Fluent API vị bạn cũng có thể Call những cách thức khác nhau vào một chuỗi phương thức.

Tìm hiểu cụ thể về Fluent API trong Entity Framework tại bài viết này:


Cấu hình mối quan hệ trong Code First

Trong đại lý dữ liệu quan hệ, một mối quan hệ là một links lâu dài thân những bảng của đại lý dữ liệu quan hệ thông qua những khóa ngoại.

Khóa nước ngoài (Foreign Key) là một trong cột hoặc tổ hợp những cột được sử dụng để tùy chỉnh cấu hình cùng thực thi một liên kết giữa tài liệu trong nhị bảng.

Có bố nhiều loại mối quan hệ thân những bảng cùng bọn chúng khác biệt tùy trực thuộc vào biện pháp quan niệm các cột tương quan.

Mối dục tình một-nhiềuMối quan hệ nhiều-nhiềuMối quan hệ nam nữ một-một

Để nắm rõ biện pháp cấu hình những quan hệ giữa các thực thể vào Entity Framwork Code First chúng ta có thể coi bài bác viết:


Migration trong Code First

Entity Framework Code First bao gồm các kế hoạch khởi chế tạo ra cơ sở tài liệu khác nhau như CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges, và DropCreateDatabaseAlways.

Tuy nhiên, có một số vấn đề với các kế hoạch này, ví dụ: nếu như bạn đã có tài liệu (trừ seed data - dữ liệu thuở đầu đạt thêm bằng code) hoặc stored procedures, triggers, v.v. trong đại lý dữ liệu của doanh nghiệp.

Các kế hoạch này được áp dụng nhằm loại bỏ toàn thể cửa hàng tài liệu và chế tác lại nó, cho nên các bạn sẽ mất tài liệu với những đối tượng DB khác.

Entity Framework đang ra mắt một lý lẽ migration tự động cập nhật lược trang bị các đại lý dữ liệu Khi mô hình của người tiêu dùng đổi khác nhưng mà không mất bất kỳ tài liệu hiện gồm hoặc các đối tượng người tiêu dùng cơ sở dữ liệu không giống. Nó sử dụng một trình khởi sinh sản đại lý dữ liệu bắt đầu điện thoại tư vấn là MigrateDatabaseToLatestVersion.

Có hai loại Migration:

Migration tự động.Migration dựa vào mã.

Để hiểu rõ về hai loại Migration trong Code First chúng ta có thể xem thêm bài viết sau:


Tạo Context với lớp thực thể từ database trong Code First

Ở phần này, bạn sẽ tò mò bí quyết chế tác Context và những lớp thực thể tự đại lý tài liệu bao gồm sẵn, áp dụng phương thức tiếp cận Code First.

Entity Framework cung ứng một phương pháp đơn giản dễ dàng để thực hiện Code First cho đại lý dữ liệu bao gồm sẵn. Nó sẽ tạo các lớp thực thể mang lại tất cả các bảng với view trong các đại lý tài liệu hiện giờ của khách hàng và thông số kỹ thuật bọn chúng với những attribute chú giải tài liệu và Fluent API.

Để thực hiện Code First mang đến cơ sở tài liệu bao gồm sẵn, nhấn vào phải vào dự án công trình của bạn vào Visual Studio -> Add -> New Item..

*

Chọn ADO.NET Entity Data Model vào hộp thoại Add New Item và đặt tên mang lại mô hình (trên đây đang là tên gọi lớp Context) rồi nhấp vào nút Add.

*

Như vậy đang msinh sống trình gợi ý Entity Data Model như dưới đây. Chọn Code First from database cùng nhận Next.

*

Bây tiếng, lựa chọn liên kết tài liệu mang đến cửa hàng dữ liệu hiện nay tất cả. Tạo kết nối mới mang lại đại lý dữ liệu của người tiêu dùng nếu list thả xuống không bao hàm liên kết mang đến đại lý dữ liệu hiện nay của khách hàng. Nhấn Next để liên tục.

*

Bây giờ đồng hồ, chọn những bảng với view cơ mà bạn muốn tạo thành những lớp thực thể với nhấp vào Finish.

*

Như vậy sẽ khởi tạo ra toàn bộ các lớp thực thể cho những bảng cùng view vào cửa hàng dữ liệu của bạn nhỏng được hiển thị dưới.

*

Nó cũng biến thành sản xuất lớp Context sau thực hiện Fluent API nhằm cấu hình những lớp thực thể theo cơ sở tài liệu của bạn.

namespace EFDemo using System; using System.Data.Entity; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; public partial class SchoolContext : DbContext public SchoolContext() : base("name=SchoolContext2") public virtual DbSet Courses get; set; public virtual DbSet Standards get; set; public virtual DbSet Students get; set; public virtual DbSet StudentAddresses get; set; public virtual DbSet Teachers get; set; public virtual DbSet View_StudentCourse get; set; protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity() .Property(e => e.CourseName) .IsUnicode(false); modelBuilder.Entity() .HasMany(e => e.Students) .WithMany(e => e.Courses) .Map(m => m.ToTable("StudentCourse").MapLeftKey("CourseId").MapRightKey("StudentId")); modelBuilder.Entity() .Property(e => e.StandardName) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.Description) .IsUnicode(false); modelBuilder.Entity() .HasMany(e => e.Students) .WithOptional(e => e.Standard) .WillCascadeOnDelete(); modelBuilder.Entity() .HasMany(e => e.Teachers) .WithOptional(e => e.Standard) .WillCascadeOnDelete(); modelBuilder.Entity() .Property(e => e.StudentName) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.RowVersion) .IsFixedLength(); modelBuilder.Entity() .HasOptional(e => e.StudentAddress) .WithRequired(e => e.Student) .WillCascadeOnDelete(); modelBuilder.Entity() .Property(e => e.Address1) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.Address2) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.City) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.State) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.TeacherName) .IsUnicode(false); modelBuilder.Entity() .HasMany(e => e.Courses) .WithOptional(e => e.Teacher) .WillCascadeOnDelete(); modelBuilder.Entity() .Property(e => e.StudentName) .IsUnicode(false); modelBuilder.Entity() .Property(e => e.CourseName) .IsUnicode(false);

Cascade Delete trong Code First

Cascade Delete sẽ tự động hóa xóa các bạn dạng ghi phụ thuộc hoặc cấu hình thiết lập những cột khóa ngoài thành phố null lúc phiên bản ghi thân phụ bị xóa vào cửa hàng dữ liệu.

Cascade Delete được nhảy theo mặc định vào Entity Framework cho tất cả những một số loại mối quan hệ, ví dụ như một-một, một-những cùng nhiều-những.

Cascade Delete vào quan hệ một-một

Hãy xem ví dụ sau đây: các thực thể Student cùng StudentAddress gồm quan hệ một-một.

public class Student public int StudentId get; set; public string StudentName get; set; public virtual StudentAddress Address get; set; public class StudentAddress public int StudentAddressId get; set; public string Address1 get; set; public string Address2 get; set; public string City get; set; public int Zipcode get; set; public string State get; set; public string Country get; set; public virtual Student Student get; set; Ví dụ tiếp sau đây minh họa cascade delete.

using (var ctx = new SchoolContext()) var stud = new Student() StudentName = "James" ; var add = new StudentAddress() Address1 = "address" ; stud.Address = add; ctx.Students.Add(stud); ctx.SaveChanges(); ctx.Students.Remove(stud);// student and its address will be removed from db ctx.SaveChanges();Trong ví dụ trên, đầu tiên EF giữ đối tượng người dùng stud của thực thể Student với đối tượng người dùng add của thực thể StudentAddress của nó vào cơ sở dữ liệu.

Sau kia, lúc xóa đối tượng người tiêu dùng stud với Hotline cách tiến hành SaveChanges(), EF đang xóa stud cũng như bản ghi khớp ứng của chính nó trong bảng StudentAddresses.

Do kia, EF có thể chấp nhận được cascade delete theo mang định.

Cascade Delete vào quan hệ một-nhiều

Hãy coi ví dụ sau đây: những thực thể Student và Standard tất cả quan hệ một-các.

public class Student public int StudentId get; set; public string StudentName get; set; public virtual Standard Standard get; set; public class Standard public Standard() Students = new List(); public int StandardId get; set; public string Description get; set; public virtual ICollection Students get; set; ví dụ như sau đây minc họa cascade delete thân các thực thể tất cả mối quan hệ một-nhiều:

using (var ctx = new SchoolContext()) var student1 = new Student() StudentName = "James" ; var student2 = new Student() StudentName = "Gandhi" ; var standard1 = new Standard() StandardName = "Standard 1" ; student1.Standard = standard1; student2.Standard = standard1; ctx.Students.Add(student1); ctx.Students.Add(student2); //inserts students and standard1 inlớn db ctx.SaveChanges(); //deletes standard1 from db & also phối standard_StandardId FK column in Students table to lớn null for // all the students that reference standard1. ctx.Standards.Remove(standard1); ctx.SaveChanges();Trong ví dụ trên, EF xóa đối tượng người tiêu dùng standard1 khỏi cửa hàng dữ liệu với nó cũng thiết lập cấu hình cột khóa ngoại standard_StandardId trong bảng Students thành null đến toàn bộ các bạn dạng ghi tham mê chiếu đối tượng người sử dụng standard1.

Lưu ý: EF tự động xóa những phiên bản ghi tương quan trong bảng trọng tâm cho các thực thể bao gồm quan hệ nhiều-các giả dụ một thực thể bị xóa.

Do kia, EF cho phép cascade delete mang định mang đến tất cả các thực thể.

Tắt Cascade Delete

Sử dụng Fluent API nhằm thông số kỹ thuật tắt cascade delete cho các thực thể để bằng cách làm WillCascadeOnDelete(), nhỏng ví dụ bên dưới.

public class SchoolContext Students get; set; public DbSet Standards get; set; protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity() .HasOptional(s => s.Standard) .WithMany() .WillCascadeOnDelete(false); }Lưu ý: Không có attribute ghi chú tài liệu như thế nào gồm sẵn nhằm tắt cascade delete.

Sử dụng Stored Procedures vào Code First

Entity Framework 6 Code First hỗ trợ khả năng tạo ra với áp dụng stored procedure nhằm triển khai những thao tác làm việc thêm, update với xóa lúc Hotline phương thức SaveChanges().

Chúng ta hãy thực hiện các stored procedure cho các thao tác làm việc CUD (Create, Update, Delete) đến thực thể Student sau.

class Student public int StudentId get; set; public string StudentName get; set; public DateTime DoB get; set; Sử dụng cách tiến hành MapToStoredProcedures() nhằm ánh xạ một thực thể với các stored procedure mang định (những stored procedure khoác định này sẽ được tạo nên vày EF API). lấy một ví dụ sau ánh xạ thực thể Student với các stored procedure mặc định.

public class SchoolContext: DbContext protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity() .MapToStoredProcedures(); public DbSet Students get; set; EF API sẽ khởi tạo ra ba stored procedure Student_Insert, Student_Update cùng Student_Delete đến thực thể Student ở trên, như hình tiếp sau đây.

*

Các stored procedure Student_Insert với Student_Update có những tđam mê số mang lại toàn bộ các nằm trong tính của thực thể Student. Riêng stored procedure Student_Delete chỉ gồm một tmê say số mang đến ở trong tính khóa bao gồm StudentId của thực thể Student. Sau đấy là mã của các stored procedure.

CREATE PROCEDURE .
ROWCOUNT > 0 AND = scope_identity() SELECT t0. FROM . AS t0 WHERE
StudentId)END

Ánh xạ Stored procedure thiết lập cho một thực thể

EF 6 được cho phép chúng ta thực hiện những stored procedure tùy chỉnh thiết lập của riêng các bạn và ánh xạ chúng cho tới một thực thể. quý khách hàng cũng hoàn toàn có thể thông số kỹ thuật ánh xạ ttê mê số cùng với những ở trong tính của thực thể.

lấy ví dụ như sau ánh xạ những stored procedure tùy chỉnh cấu hình với thực thể Student.

protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity().MapToStoredProcedures(p => p.Insert(sp => sp.HasName("sp_InsertStudent").Parameter(pm => pm.StudentName, "name").Result(rs => rs.StudentId, "Id")).Update(sp => sp.HasName("sp_UpdateStudent").Parameter(pm => pm.StudentName, "name")).Delete(sp => sp.HasName("sp_DeleteStudent").Parameter(pm => pm.StudentId, "Id")) );Trong ví dụ bên trên, thực thể Student được ánh xạ tới những stored procedure sp_InsertStudent, sp_UpdateStudent và sp_DeleteStudent. Nó cũng cấu hình ánh xạ giữa các tham số và trực thuộc tính của thực thể.

Sử dụng stored procedure mang lại toàn bộ những thực thể

Bạn hoàn toàn có thể ánh xạ tất cả các thực thể của bản thân với các stored procedure khoác định vào một câu lệnh như dưới đây.

protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Types().Configure(t => t.MapToStoredProcedures());

Hạn chế

Chỉ hoàn toàn có thể sử dụng Fluent API để ánh xạ các stored procedure. Không gồm attribute chú giải tài liệu nào gồm sẵn vào EF 6 nhằm ánh xạ stored procedure.quý khách đề xuất ánh xạ những stored procedure thêm, cập nhật và xóa cho 1 thực thể nếu như bạn muốn áp dụng stored procedure cho những hoạt động CUD. Ánh xạ có một trong số các thao tác làm việc CUD là ko được phxay.

Chuyển cấu hình Fluent API sang một lớp riêng biệt trong Code First

Nlỗi chúng ta sẽ thấy trong những lý giải trước, Shop chúng tôi sẽ cấu hình tất cả các lớp thực thể bằng Fluent API vào thủ tục OnModelCreating().

Tuy nhiên, nó trngơi nghỉ phải cực nhọc gia hạn nếu như bạn cấu hình một trong những lượng bự những lớp thực thể vào OnModelCreating.

EF 6 chất nhận được các bạn tạo ra một tấm riêng biệt mang đến từng thực thể và đặt toàn bộ các cấu hình liên quan đến thực thể vào lớp kia.

Hãy coi ví dụ sau chỗ chúng ta thông số kỹ thuật thực thể Student.

public class SchoolDBContext: DbContext public SchoolDBContext(): base() public DbSet Students get; set; protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity().ToTable("StudentInfo"); modelBuilder.Entity().HasKey(s => s.StudentKey); modelBuilder.Entity() .Property(p => p.DateOfBirth) .HasColumnName("DoB") .HasColumnOrder(3) .HasColumnType("datetime2"); modelBuilder.Entity() .Property(p => p.StudentName) .HasMaxLength(50); modelBuilder.Entity() .Property(p => p.StudentName) .IsConcurrencyToken(); modelBuilder.Entity() .HasMany(s => s.Courses) .WithMany(c => c.Students) .Map(cs => cs.MapLeftKey("StudentId"); cs.MapRightKey("CourseId"); cs.ToTable("StudentCourse"); ); Bây giờ, chúng ta có thể dịch chuyển tất cả các cấu hình tương quan mang đến thực thể Student thanh lịch một lớp riêng có bắt đầu tự EntityTypeConfiguration.

Hãy coi lớp StudentEntityConfigurations sau bao gồm tất cả các thông số kỹ thuật cho thực thể Student.

public class StudentEntityConfiguration: EntityTypeConfiguration public StudentEntityConfiguration() this.ToTable("StudentInfo"); this.HasKey(s => s.StudentKey); this.Property(p => p.DateOfBirth) .HasColumnName("DoB") .HasColumnOrder(3) .HasColumnType("datetime2"); this.Property(p => p.StudentName) .HasMaxLength(50); this.Property(p => p.StudentName) .IsConcurrencyToken(); this.HasMany(s => s.Courses) .WithMany(c => c.Students) .Map(cs => cs.MapLeftKey("StudentId"); cs.MapRightKey("CourseId"); cs.ToTable("StudentCourse"); ); Nhỏng chúng ta có thể thấy ngơi nghỉ bên trên, chúng tôi vẫn đưa tất cả những cấu hình cho thực thể Student vào thủ tục khởi chế tạo của lớp StudentEntityConfiguration, bao gồm xuất phát từ EntityTypeConfiguration.

Bây tiếng, bạn cần thêm lớp cấu hình tùy chỉnh thiết lập này áp dụng Fluent API, nlỗi ví dụ bên dưới.

public class SchoolDBContext: DbContext public SchoolDBContext(): base() public DbSet Students get; set; protected override void OnModelCreating(DbModelBuilder modelBuilder) // Moved all Student related configuration lớn StudentEntityConfiguration class modelBuilder.Configurations.Add(new StudentEntityConfiguration()); Do kia, chúng ta có thể áp dụng những lớp cấu hình để tăng tài năng phát âm với gia hạn.

Seed Data trong Code-First

quý khách hàng có thể ckém tài liệu vào các bảng cơ sở dữ liệu của bản thân mình trong quy trình khởi sinh sản cửa hàng tài liệu. Vấn đề này sẽ rất đặc biệt nếu bạn muốn cung cấp một vài dữ liệu phân tách đến vận dụng của công ty hoặc một số trong những dữ liệu thiết yếu mặc định cho áp dụng của chúng ta.

Để tạo ra dữ liệu vào các đại lý tài liệu của người tiêu dùng, các bạn phải khởi tạo một trình khởi tạo DB tùy chỉnh cấu hình, nlỗi bạn đang tạo thành vào chương Khởi tạo ra đại lý dữ liệu với ghi đè cổ cách tiến hành Seed.

lấy ví dụ sau đây cho biết giải pháp chúng ta có thể cung cấp dữ liệu khoác định đến bảng Standard trong những khi khởi sản xuất đại lý tài liệu SchoolDB:

public class SchoolDBInitializer : DropCreateDatabaseAlways protected override void Seed(SchoolDBContext context) IList defaultStandards = new List(); defaultStandards.Add(new Standard() StandardName = "Standard 1", Description = "First Standard" ); defaultStandards.Add(new Standard() StandardName = "Standard 2", Description = "Second Standard" ); defaultStandards.Add(new Standard() StandardName = "Standard 3", Description = "Third Standard" ); context.Standards.AddRange(defaultStandards); base.Seed(context); Bây giờ đồng hồ, thiết lập lớp khởi chế tạo DB này vào lớp Context nlỗi dưới.

public class SchoolContext: DbContext public SchoolContext(): base("SchoolDB") Database.SetInitializer(new SchoolDBInitializer()); public DbSet Students get; set; public DbSet Standards get; set;

Tạo những quy ước tùy chỉnh cấu hình vào Code First

Quý khách hàng đang tò mò về các quy ước vào Code First vào phần đầu của bài viết. EF 6 cũng cung cấp kĩ năng quan niệm các quy ước tùy chỉnh cấu hình của riêng bạn.

Có hai các loại quy ước chính: Quy ước cấu hình và Quy ước mô hình.

Quy ước cấu hình

Quy ước thông số kỹ thuật là một trong cách để cấu hình các thực thể nhưng mà ko ghi đtrần cấu hình mang định được hỗ trợ trong Fluent API.

Bạn hoàn toàn có thể quan niệm một quy ước thông số kỹ thuật vào thủ tục OnModelCreating() cùng cả trong lớp thiết lập cấu hình, tương tự nlỗi biện pháp bạn sẽ quan niệm ánh xạ thực thể thông thường cùng với Fluent API.

Ví dụ: bạn muốn cấu hình một nằm trong tính làm cho ở trong tính khóa mang tên khớp với tên thực thể_ID, ví dụ: ở trong tính Student_ID của thực thể Student vẫn là khóa chủ yếu. Sau phía trên khái niệm quy ước này.

protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder .Properties() .Where(p => p.Name == p.DeclaringType.Name + "_ID") .Configure(p => p.IsKey()); base.OnModelCreating(modelBuilder);Theo cùng một cách, chúng ta có thể khái niệm quy ước mang đến kích thước của thứ hạng tài liệu.

lấy ví dụ dưới đây có mang một quy ước cho những nằm trong tính chuỗi. Nó sẽ khởi tạo những cột nvarchar bao gồm kích cỡ 50 trong Squốc lộ Server cho tất cả các ở trong tính mẫu mã chuỗi của một thực thể.

protected override void OnModelCreating(DbModelBuilder modelBuilder)modelBuilder.Properties().Where(p => p.PropertyType.Name == "String").Configure(p => p.HasMaxLength(50)); base.OnModelCreating(modelBuilder);quý khách hàng cũng hoàn toàn có thể định nghĩa một lớp tùy chỉnh cấu hình đến quy ước này bằng phương pháp kế thừa lớp Convention, nlỗi ví dụ mặt dưới:

public class PKConvention : Convention public PKConvention() this.Properties() .Where(p => p.Name == p.DeclaringType.Name + "_ID") .Configure(p => p.IsKey()); Sau lúc chế tạo ra lớp quy ước tùy chỉnh cấu hình, hãy thêm nó vào các quy ước như bên dưới đây:

protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Conventions.Add();

Quy ước tế bào hình

Quy ước mô hình dựa trên vô cùng dữ liệu quy mô cơ bản. Có những quy ước cho cả CSDL với SSDL.

Xem thêm: Con Gái “ Dẹo Là J, Dẹo Nghĩa Là Gì, Dẹo Là Gì, Dẹo Viết Tắt, Định Nghĩa, Ý Nghĩa

Tạo một lớp thực hiện interface IConceptualModelConvention từ bỏ những quy ước CSDL và IStoreModelConvention từ bỏ những quy ước SSDL.