Code first là gì

Code First là gì?

Entity Framework đã ra mắt cách tiếp cận Code First vào Entity Framework 4.1. Code First hầu hết có ích trong Thiết kế phía tên miền.

You watching: 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 áp dụng và ban đầu chế tạo những lớp mang lại thực thể miền cố gắng vì kiến thiết cơ sở dữ liệu trước rồi sản xuất những lớp khớp với kiến tạo cửa hàng tài liệu của người tiêu dùng. Hình dưới đây minh họa cách tiếp cận Code First.

*

Như chúng ta có thể thấy trong hình trên, Entity Framework API sẽ tạo cơ sở dữ liệu dựa trên thông số kỹ thuật với những lớp miền của khách hàng. Như vậy tức là bạn phải ban đầu viết code trước bằng C# hoặc VB.NET cùng kế tiếp Entity Framework (EF) sẽ tạo cơ sở dữ liệu từ bỏ code của khách hàng.

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

Hình sau đây minch họa tiến trình cải tiến và phát triển Code First.

*

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

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

Các quy ước là các cỗ phép tắc mặc định tự động hóa thông số kỹ thuật một quy mô định nghĩa dựa trên những lớp miền của người sử dụng Lúc thao tác làm việc cùng với biện pháp tiếp cận Code First.

Nlỗi các bạn đang thấy vào ví dụ sinh hoạt bên trên, Entity Framework API vẫn thông số kỹ thuật các khóa bao gồm, khóa ngoại, những mối quan hệ, hình trạng tài liệu của cột, v.v. tự các lớp miền mà ko phải thông số kỹ thuật bổ sung cập nhật.

Như vậy là vì các quy ước của Entity Framework Code First. Nếu các lớp miền của chúng ta tuân thủ theo đúng những quy ước thì lược thiết bị đại lý dữ liệu sẽ được cấu hình dựa trên các quy ước này.

Các quy ước vào Entity Framework 6.x Code First được định nghĩa trong namespace System.Data.Entity.ModelConfiguration.Conventions .

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


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

Bảng sau liệt kê loại dữ liệu C# được ánh xạ cùng với hình dạng dữ liệu Squốc lộ Server.


Kiểu tài liệu C#Ánh xạ cho tới đẳng cấp tài 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 tiếp sau đây minc họa ánh xạ quy ước cùng với các đại lý tài liệu.

*

Quy ước về côn trùng quan hệ

Entity Framework 6 chế tạo mối quan hệ một-các bằng cách thực hiện nằm trong tính điều hướng theo quy ước mang định. Phần này sẽ tiến hành trình diễn chi tiết vào bài viết không giống.

Lưu ý: Entity Framework 6 không tồn tại các quy ước mặc định cho những quan hệ một-một cùng nhiều-những. quý khách hàng nên 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 chế tác mẫu mã phức tạp mang đến lớp ko bao hàm thuộc tính khóa với khóa thiết yếu không được ĐK bằng trực thuộc tính DataAnnotation hoặc Fluent API.

Phần này trình diễn tổng quan về các quy ước vào Code First. Các quy ước này rất có thể được ghi đnai lưng bởi những áp dụng trực thuộc tính DataAnnotation hoặc Fluent API.

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

Tại phần này, họ sẽ khám phá phương pháp Entity Framework đưa ra quyết định tên cơ sở tài liệu với máy chủ trong khi khởi tạo ra các đại lý tài liệu Theo phong cách tiếp cận Code First.

Hình dưới đây cho biết một quá trình khởi sinh sản cơ sở tài liệu, dựa vào tsay đắm số được truyền trong phương thức khởi sinh sản các đại lý của lớp Context được kế thừa từ bỏ lớp DbContext:

*

Tđắm đuối số khởi tạo thành cơ sở dữ liệu

Theo hình bên trên, thủ tục khởi tạo ra cơ sở của lớp Context có thể gồm tham số sau:

Không có tyêu thích số.Tên các đại lý dữ liệu.Tên chuỗi liên kết.

Không bao gồm tham số

Nếu chúng ta không chỉ có định tyêu thích số trong thủ tục khởi tạo nên đại lý của lớp Context thì nó sẽ tạo nên đại lý tài liệu trong máy chủ SQLEXPRESS cục bộ của bạn cùng với tên khớp cùng với Namespace. Tên lớp Context.

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

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

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

Nếu chúng ta chỉ định và hướng dẫn tđê mê số tên đại lý tài liệu, thì Code First sẽ khởi tạo đại lý tài liệu với thương hiệu chúng ta đã chỉ định vào thủ tục khởi tạo nên cơ sở trong máy chủ cơ sở tài liệu SQLEXPRESS toàn thể.

ví dụ như, Code First sẽ tạo nên các đại lý dữ liệu có tên MySchoolDB mang lại 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ể hướng đẫn chuỗi kết nối trong ứng dụng.config hoặc website.config với hướng dẫn và chỉ định tên chuỗi liên kết ban đầu bởi "name =" vào cách thức khởi tạo ra cơ sở của lớp Context.

Hãy để mắt tới ví dụ sau vị trí bọn họ truyền tđắm say số name=SchoolDBConnectionString vào cách thức khởi chế tác cửa hàng.

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

Trong lớp Context ở trên, Cửa Hàng chúng tôi hướng đẫn tên chuỗi kết nối làm cho tmê mẩn số. Xin lưu ý rằng tên chuỗi kết nối buộc phải ban đầu bằng "name =", nếu không, nó sẽ coi nó là tên gọi cửa hàng dữ liệu.

Tên các đại lý tài liệu vào chuỗi liên kết trong App.config là SchoolDB. Entity Framework (EF) sẽ khởi tạo cửa hàng dữ liệu SchoolDB mới hoặc sử dụng đại lý tài liệu SchoolDB hiện tất cả vào Squốc lộ Server toàn cục.

Đảm bảo rằng chúng ta tất cả nằm trong tính providerName="System.Data.SqlClient" đến cửa hàng tài liệu Squốc lộ Server vào chuỗi liên kết.

Chiến lược khởi tạo thành đại lý dữ liệu

Quý Khách vẫn sinh sản cửa hàng tài liệu sau thời điểm chạy áp dụng Code First lần thứ nhất, nhưng lại lần thiết bị nhị trsinh sống đi thì sao? Nó sẽ tạo nên ra một đại lý dữ liệu new mỗi khi chúng ta chạy ứng dụng?

Còn môi trường thiên nhiên Production thì sao? Làm vậy nào để chúng ta update các đại lý tài liệu khi chúng ta biến đổi mô hình miền của bạn?

Để cách xử trí những kịch bạn dạng này, bạn đề nghị sử dụng một trong các kế hoạch khởi tạo đại lý dữ liệu.

Có tứ kế hoạch khởi chế tác đại lý dữ liệu không giống nhau trong Code First:

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

Chiến lược thừa kế vào Code First

quý khách hàng rất có thể thiết kế những lớp thực thể của bản thân bằng phương pháp sử dụng tính thừa kế vào C#.

Trong lập trình phía đối tượng, những lớp có quan hệ "has a" với "is a", trong lúc đó mô hình quan hệ tình dục dựa vào Squốc lộ chỉ có mối quan hệ "has a" thân những bảng.

Hệ quản trị cửa hàng dữ liệu Squốc lộ không hỗ trợ mối quan hệ "is a". Vì vậy, làm nắm nào bạn có thể ánh xạ các lớp thực thể có mối quan hệ "is a" vào cơ sở dữ liệu quan liêu hệ?

Dưới đấy là bố phương pháp tiếp cận khác nhau nhằm ánh xạ thừa kế vào cơ sở tài liệu vào Code First:

Table per Hierarchy (TPH): Cách tiếp cận này ý kiến đề nghị sinh sản một bảng thông thường cho toàn thể những lớp bên trong phân cấp cho kế thừa. Bảng này còn có một cột để rành mạch thân những lớp nhỏ. Đây là 1 trong chiến lược ánh xạ kế thừa mang định trong Entity Framework.Table per Type (TPT): Cách tiếp cận này kiến nghị tạo mỗi bảng đến từng phần bên trong phân cấp cho kế thừa (chế tác 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ị tạo mỗi bảng đến từng lớp con trong phân cấp cho kế thừa, tuy vậy ko tạo nên bảng cho lớp phụ vương. Vì vậy các nằm trong tính của lớp thân phụ vẫn là một trong những phần của mỗi bảng của lớp con.

Xem chi tiết tía giải pháp tiếp cạn nhằm anh xạ kế thừa vào cơ sở tài liệu vào Code First:


Trung Nguyengiaidap.info
*

Cấu hình các lớp trong Entity Framework

Code First xây dừng quy mô định nghĩa từ bỏ những lớp thực thể của doanh nghiệp bằng cách thực hiện các quy ước mặc định.

EF 6 Code First tận dụng tối đa một mẫu lập trình được Hotline là quy ước về thông số kỹ thuật. Tuy nhiên, bạn có thể ghi đnai lưng các quy ước này bằng phương pháp cấu hình các lớp thực thể của người tiêu dùng để cung ứng đến EF đọc tin cần thiết.

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

Attribute ghi chú tài liệu.Fluent API.

Attribute chú thích dữ liệu

Chụ yêu thích dữ liệu là một trong thông số kỹ thuật dựa vào attribute đơn giản, chúng ta cũng có thể áp dụng cho các lớp và nằm trong tính của chính nó.

Các attribute này không chỉ là dành riêng cho EF bên cạnh đó được thực hiện vào ASP.NET Web Form cùng ASP..NET MVC. Do đó, chúng được đặt trong một namespace hiếm hoi là System.ComponentModel.DataAnnotations.

lấy ví dụ tiếp sau đây minh họa vấn đề thực hiện một vài attribute chú thí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 hỗ trợ tất cả các tùy lựa chọn cấu hình mang lại Entity Framework. Vì vậy, bạn cũng có thể sử dụng Fluent API, nó cung cấp toàn bộ những tùy lựa chọn cấu hình đến EF.Tìm đọc chi tiết về attribute chú giải tài liệu vào Entity Framework tại nội dung bài viết này:


Trung Nguyengiaidap.info

Fluent API

Một biện pháp không giống để định cấu hình các lớp là bằng phương pháp áp dụng Entity Framework Fluent API. Fluent API dựa trên mẫu mã xây đắp Fluent API (xuất xắc còn gọi là đồ họa thông thạo) trong đó hiệu quả được tạo nên thành từ 1 chuỗi cách thức.

Cấu hình Fluent API rất có thể được vận dụng khi EF gây ra quy mô từ những lớp thực thể của khách hàng. quý khách hàng hoàn toàn có thể thêm những thông số kỹ thuật Fluent API bằng phương pháp ghi đè thủ tục OnModelCreating của lớp DbContext trong Entity Framework 6.x, như được trình diễn mặt 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 domain classes using modelBuilder here.. quý khách có thể áp dụng tyêu thích số modelBuilder, một đối tượng người sử dụng của lớp DbModelBuilder nhằm thông số kỹ thuật những lớp thực thể của công ty. DbModelBuilder được Điện thoại tư vấn là Fluent API do chúng ta có thể Hotline các thủ tục khác biệt trong một chuỗi cách tiến hành.

Tìm phát âm chi tiết về Fluent API trong Entity Framework tại nội dung bài viết này:


Cấu hình quan hệ trong Code First

Trong đại lý tài liệu dục tình, một mối quan hệ là 1 trong link mãi mãi giữa những bảng của cơ sở dữ liệu tình dục trải qua các khóa nước ngoài.

Khóa ngoại (Foreign Key) là 1 trong những cột hoặc tổ hợp những cột được sử dụng nhằm tùy chỉnh thiết lập và thực hiện một link thân dữ liệu trong nhị bảng.

Có cha loại mối quan hệ giữa các bảng với bọn chúng khác biệt tùy trực thuộc vào giải pháp có mang các cột tương quan.

Mối tình dục một-nhiềuMối quan hệ nhiều-nhiềuMối quan hệ giới tính một-một

Để làm rõ bí quyết thông số kỹ thuật các mối quan hệ giữa những thực thể vào Entity Framwork Code First chúng ta có thể coi bài bác viết:


Migration vào Code First

Entity Framework Code First tất cả những kế hoạch khởi sinh sản cửa hàng tài liệu không giống nhau như CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges, và DropCreateDatabaseAlways.

Tuy nhiên, bao gồm một trong những vấn đề cùng với các chiến lược này, ví dụ: ví như bạn đã sở hữu dữ liệu (trừ seed data - tài liệu lúc đầu có thêm bằng code) hoặc stored procedures, triggers, v.v. trong đại lý dữ liệu của người sử dụng.

Các chiến lược này được áp dụng để sa thải cục bộ các đại lý dữ liệu cùng chế tạo lại nó, cho nên vì thế bạn sẽ mất tài liệu cùng các đối tượng DB không giống.

Entity Framework đã ra mắt một hình thức migration tự động hóa update lược thiết bị đại lý tài liệu Lúc mô hình của doanh nghiệp biến đổi nhưng mà ko mất bất kỳ tài liệu hiện tại gồm hoặc những đối tượng người tiêu dùng đại lý tài liệu không giống. Nó sử dụng một trình khởi sinh sản đại lý tài liệu bắt đầu gọi là MigrateDatabaseToLatestVersion.

See more: Hệ Thống Bms Là Gì - Lợi Ích Và Nhược Điểm Của Hệ Thống Bms

Có nhị các loại Migration:

Migration auto.Migration dựa trên mã.

Để làm rõ về nhì nhiều loại Migration vào Code First bạn cũng có thể xem thêm nội dung bài viết sau:


Tạo Context và lớp thực thể trường đoản cú database vào Code First

Tại phần này, bạn sẽ tò mò phương pháp tạo Context và những lớp thực thể từ bỏ cơ sở tài liệu có sẵn, thực hiện phương pháp tiếp cận Code First.

Entity Framework hỗ trợ một giải pháp đơn giản nhằm sử dụng Code First đến đại lý tài liệu gồm sẵn. Nó sẽ tạo những lớp thực thể đến tất cả các bảng cùng view vào cửa hàng dữ liệu hiện giờ của doanh nghiệp và cấu hình bọn chúng với những attribute chú giải tài liệu cùng Fluent API.

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

*

Chọn ADO.NET Entity Data Model trong hộp thoại Add New Item cùng viết tên mang lại quy mô (phía trên sẽ là tên gọi lớp Context) rồi nhấp vào nút Add.

*

Điều này sẽ mở trình giải đáp Entity Data Model nlỗi sau đây. Chọn Code First from database và dìm Next.

*

Bây giờ, lựa chọn liên kết tài liệu mang lại cửa hàng tài liệu hiện nay gồm. Tạo liên kết new mang lại các đại lý dữ liệu của bạn nếu như list thả xuống không bao gồm kết nối cho đại lý dữ liệu hiện nay của chúng ta. Nhấn Next nhằm thường xuyên.

*

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

*

Vấn đề này sẽ khởi tạo ra toàn bộ các lớp thực thể cho các bảng cùng view vào đại lý tài liệu của công ty nhỏng được hiển thị dưới.

*

Nó cũng biến thành chế tác lớp Context sau thực hiện Fluent API để thông số kỹ thuật những lớp thực thể theo các đại lý tài liệu của người tiêu dùng.

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 vào Code First

Cascade Delete sẽ auto xóa những phiên bản ghi phụ thuộc vào hoặc tùy chỉnh cấu hình những cột khóa ngoại thành null khi phiên bản ghi thân phụ bị xóa vào các đại lý dữ liệu.

Cascade Delete được bật theo mặc định trong Entity Framework cho toàn bộ các một số loại mối quan hệ, ví dụ như một-một, một-những với nhiều-những.

Cascade Delete trong mối quan hệ một-một

Hãy coi ví dụ sau đây: những thực thể Student và StudentAddress tất cả 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; lấy ví dụ dưới đâ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 lưu lại đối tượng người dùng stud của thực thể Student cùng đối tượng người sử dụng add của thực thể StudentAddress của chính nó vào đại lý dữ liệu.

Sau đó, Lúc xóa đối tượng người sử dụng stud cùng call cách làm SaveChanges(), EF đang xóa stud cũng giống như bản ghi tương xứng của chính nó trong bảng StudentAddresses.

Do kia, EF cho phép cascade delete theo khoác đị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ới Standard bao gồm quan hệ một-nhiều.

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ư dưới đây minc họa cascade delete giữa những thực thể bao gồm 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 into lớn db ctx.SaveChanges(); //deletes standard1 from db và also mix standard_StandardId FK column in Students table to 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 dùng standard1 khỏi các đại lý dữ liệu cùng nó cũng cấu hình thiết lập cột khóa ngoại standard_StandardId trong bảng Students thành null mang lại toàn bộ những bạn dạng ghi tmê say chiếu đối tượng standard1.

Lưu ý: EF tự động hóa xóa các bạn dạng ghi liên quan vào bảng trọng tâm cho những thực thể có mối quan hệ nhiều-những nếu như một thực thể bị xóa.

Do kia, EF cho phép cascade delete khoác định mang đến toàn bộ những 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 những thực thể nhằm bằng cách tiến hành WillCascadeOnDelete(), như 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 tất cả attribute ghi chú dữ liệu nào tất cả sẵn nhằm tắt cascade delete.

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

Entity Framework 6 Code First cung ứng kĩ năng chế tạo cùng thực hiện stored procedure để triển khai những thao tác làm việc thêm, cập nhật với xóa lúc điện thoại tư vấn cách làm SaveChanges().

Chúng ta hãy áp dụng các stored procedure cho các thao tác CUD (Create, Update, Delete) mang đế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 phương thức MapToStoredProcedures() để ánh xạ một thực thể cùng với các stored procedure khoác định (các stored procedure mặc định này sẽ tiến hành tạo thành vị EF API). lấy ví dụ sau ánh xạ thực thể Student với những stored procedure khoá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 tía stored procedure Student_Insert, Student_Update và Student_Delete mang đến thực thể Student sinh sống trên, như hình tiếp sau đây.

*

Các stored procedure Student_Insert với Student_Update tất cả những tham mê số mang lại tất cả các nằm trong tính của thực thể Student. Riêng stored procedure Student_Delete chỉ tất cả một tsay đắm số đến nằm trong tính khóa thiết yếu 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 chất nhận được chúng ta sử dụng các stored procedure tùy chỉnh cấu hình của riêng chúng ta với ánh xạ chúng cho tới một thực thể. Bạn cũng hoàn toàn có thể cấu hình ánh xạ tham mê số với các thuộc tính của thực thể.

lấy ví dụ như sau ánh xạ các stored procedure tùy chỉnh thiết lập cùng 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ụ trên, thực thể Student được ánh xạ cho tới những stored procedure sp_InsertStudent, sp_UpdateStudent và sp_DeleteStudent. Nó cũng thông số kỹ thuật ánh xạ thân các tham mê số cùng nằm trong tính của thực thể.

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

Quý khách hàng rất có thể ánh xạ tất cả các thực thể của chính mình cùng với những stored procedure mặc định trong một câu lệnh như tiếp sau đây.

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

Hạn chế

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

Chuyển thông số kỹ thuật Fluent API lịch sự một tấm riêng biệt vào Code First

Nhỏng chúng ta vẫn thấy trong các hướng dẫn trước, Cửa Hàng chúng tôi đã cấu hình toàn bộ những lớp thực thể bằng Fluent API vào cách thức OnModelCreating().

Tuy nhiên, nó trsống yêu cầu khó gia hạn nếu bạn cấu hình một số lượng lớn các lớp thực thể vào OnModelCreating.

EF 6 có thể chấp nhận được bạn sản xuất một tờ riêng biệt mang đến từng thực thể cùng đặt toàn bộ các cấu hình tương quan đến thực thể trong lớp đó.

Hãy xem ví dụ sau vị trí họ cấu hình 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ờ đồng hồ, chúng ta có thể dịch rời tất cả các cấu hình liên quan mang lại thực thể Student sang một tấm riêng rẽ có bắt đầu từ bỏ EntityTypeConfiguration.

Hãy coi lớp StudentEntityConfigurations sau bao hàm toàn bộ các cấu hình mang đến 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ư chúng ta có thể thấy ở trên, Shop chúng tôi vẫn chuyển toàn bộ những thông số kỹ thuật cho thực thể Student vào cách tiến hành khởi tạo thành của lớp StudentEntityConfiguration, gồm nguồn gốc từ bỏ EntityTypeConfiguration.

Bây tiếng, bạn cần thêm lớp cấu hình tùy chỉnh cấu hình này sử dụng Fluent API, như ví dụ 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 đó, chúng ta có thể áp dụng những lớp thông số kỹ thuật để tăng kỹ năng gọi cùng bảo trì.

Seed Data vào Code-First

quý khách rất có thể cyếu tài liệu vào các bảng đại lý tài liệu của mình trong quá trình khởi sinh sản các đại lý tài liệu. Điều này sẽ rất đặc biệt trường hợp bạn có nhu cầu cung cấp một trong những dữ liệu thử nghiệm mang lại vận dụng của người sử dụng hoặc một vài tài liệu thiết yếu mặc định mang lại áp dụng của chúng ta.

Để tạo tài liệu vào cơ sở dữ liệu của công ty, bạn phải tạo lập một trình khởi chế tạo DB cấu hình thiết lập, nhỏng bạn vẫn tạo thành trong chương thơm Khởi chế tạo ra đại lý dữ liệu với ghi đtrằn cách thức Seed.

lấy ví dụ sau đây cho thấy thêm phương pháp bạn cũng có thể hỗ trợ tài liệu khoác định mang đến bảng Standard trong những khi khởi tạo thành cửa hàng 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ồ, tùy chỉnh lớp khởi tạo thành DB này trong lớp Context nhỏng 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 thiết lập trong Code First

Bạn vẫn tò mò về các quy ước vào Code First vào phần đầu của nội dung bài viết. EF 6 cũng cung cấp khả năng có mang các quy ước tùy chỉnh của riêng rẽ các bạn.

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

Quy ước cấu hình

Quy ước thông số kỹ thuật là một phương pháp để thông số kỹ thuật các thực thể mà ko ghi đè cổ thông số kỹ thuật khoác định được cung cấp vào Fluent API.

quý khách có thể khái niệm một quy ước cấu hình vào thủ tục OnModelCreating() và cả vào lớp thiết lập cấu hình, tương tự nlỗi biện pháp bạn sẽ khái niệm ánh xạ thực thể thường thì cùng với Fluent API.

Ví dụ: bạn muốn thông số kỹ thuật một ở trong tính làm nằm trong tính khóa có tên khớp cùng với tên thực thể_ID, ví dụ: nằm trong tính Student_ID của thực thể Student đang là khóa chủ yếu. Sau phía trên quan 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 bí quyết, bạn cũng có thể định nghĩa quy ước mang đến size của vẻ bên ngoài dữ liệu.

lấy ví dụ dưới đây quan niệm một quy ước cho các thuộc tính chuỗi. Nó sẽ tạo nên các cột nvarchar gồm kích thước 50 vào Squốc lộ Server đến tất cả những thuộc tính phong cách 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ể có mang một lớp thiết lập cấu hình đến quy ước này bằng cách 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 khi sản xuất lớp quy ước tùy chỉnh thiết lập, hãy thêm nó vào những quy ước nhỏng bên dưới đây:

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

Quy ước mô hình

Quy ước mô hình dựa trên hết sức dữ liệu quy mô cơ bản. Có các quy ước cho tất cả cơ sở dữ liệu và SSDL.

See more: Nghĩa Của Từ Sin Là Gì ? Cos Là Gì ? Đạo Hàm Của Sin Cos Tan Cot Sec Csc Là Gì

Tạo một tờ thực hiện interface IConceptualModelConvention từ các quy ước DataBase với IStoreModelConvention tự các quy ước SSDL.


Chuyên mục: Giải Đáp