Code First là gì?

Entity Framework sẽ giới thiệu phương pháp tiếp cận Code First vào Entity Framework 4.1. Code First đa phần bổ ích vào Thiết kế hướng domain.

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

Trong cách tiếp cận Code First, bạn tập trung vào miền của áp dụng và bắt đầu tạo nên các lớp mang đến thực thể miền vắt vì chưng thi công cơ sở tài liệu trước rồi sinh sản những lớp khớp với kiến thiết các đại lý tài liệu của người tiêu dùng. Hình tiếp sau đây minc họa bí quyết tiếp cận Code First.

*

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

Quy trình thao tác với Code First

Hình dưới đây minh họa quá trình cải cách và phát triển Code First.

*

Quy trình trở nên tân tiến Theo phong cách tiếp cận Code First đang là: Tạo hoặc sửa đổi các lớp miền -> cấu hình những lớp miền này bởi những ở trong tính ghi chú tài liệu hoặc Fluent API -> Tạo hoặc cập nhật lược đồ gia dụng cửa hàng 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à những cỗ luật lệ khoác định auto cấu hình một mô hình quan niệm dựa trên các lớp miền của chúng ta Khi thao tác cùng với phương pháp tiếp cận Code First.

Nhỏng bạn đang thấy vào ví dụ ở trên, Entity Framework API đang thông số kỹ thuật những khóa chủ yếu, khóa nước ngoài, những quan hệ, phong cách dữ liệu của cột, v.v. tự các lớp miền mà lại không đề xuất thông số kỹ thuật bổ sung.

Điều này là do các quy ước của Entity Framework Code First. Nếu các lớp miền của doanh nghiệp theo đúng những quy ước thì lược đồ dùng cửa hàng tài liệu sẽ tiến hành thông số kỹ thuật dựa trên các quy ước này.

Các quy ước vào Entity Framework 6.x Code First được khái niệm trong 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 sinh sản tất cả các đối tượng người dùng DB vào lược vật dbo .
Tên bảng + "s" EF sẽ khởi tạo bảng DB cùng với thương hiệu lớp thực thể thêm "s" sinh hoạt cuối, ví dụ: lớp Student sẽ ánh xạ tới bảng Students.
Tên khóa chủ yếu 1) Id 2) + "Id" (ko sáng tỏ chữ hoa chữ thường) EF sẽ tạo nên cột khóa bao gồm đến nằm trong tính có tên Id hoặc + "Id" (không rành mạch chữ hoa chữ thường).
Tên khóa ngoại Theo mặc định, EF đã tra cứu ở trong tính khóa ngoại tất cả cùng tên với tên khóa chính của thực thể chính.Nếu ở trong tính khóa nước ngoài ko mãi sau, 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 trong bảng Students nếu như thực thể Student ko cất trực thuộc tính khóa ngoại mang đến Grade.
Cột Null EF sinh sản một cột null đến tất cả những nằm trong tính hình dạng tsay mê chiếu với các thuộc tính kiểu dáng nguim tdiệt nullable, ví dụ: string, Nullable , Student, Grade (toàn bộ các ở trong tính giao diện lớp)
Cột Not Null EF chế tạo các cột Not Null cho các ở trong tính khóa bao gồm và những trực thuộc tính hình trạng quý hiếm 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ự nlỗi những ở trong tính trong một tấm thực thể. Tuy nhiên, các cột khóa thiết yếu sẽ được dịch chuyển lên thứ nhất.
Ánh xạ ở trong tính vào DB Theo khoác định, tất cả những trực thuộc tính đang ánh xạ cho tới đại lý tài liệu. Sử dụng ở trong tính nhằm thải trừ trực thuộc tính hoặc lớp không ánh xạ vào DB.
Cascade deleteĐược bật theo mặc định đến tất cả các một số loại quan hệ.

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


Kiểu tài liệu C#Ánh xạ tới loại dữ liệu Squốc lộ 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 nhẹm ra exception)
objectKhông ánh xạ

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

*

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

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

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

Quy ước thứ hạng phức tạp

Code First chế tạo vẻ bên ngoài tinh vi đến lớp ko bao gồm thuộc tính khóa và khóa thiết yếu không được ĐK bởi 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 trong Code First. Các quy ước này hoàn toàn có thể được ghi đtrằn bởi các áp dụng nằm trong tính DataAnnotation hoặc Fluent API.

Khởi chế tạo cơ sở dữ liệu vào Code First

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

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

*

Tsay đắm số khởi chế tạo các đại lý dữ liệu

Theo hình bên trên, cách thức khởi chế tạo đại lý của lớp Context rất có thể có tham mê số sau:

Không gồm tmê mệt số.Tên các đại lý dữ liệu.Tên chuỗi liên kết.

Không có tđê mê số

Nếu bạn không chỉ định tsay mê số vào cách tiến hành khởi tạo thành các đại lý của lớp Context thì nó sẽ khởi tạo các đại lý dữ liệu trong sever SQLEXPRESS tổng thể của khách hàng cùng với thương hiệu khớp với Namespace. Tên lớp Context.

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

namespace SchoolDataLayer public class Context: DbContext public Context(): base() Tên cơ sở dữ liệu

Quý khách hàng cũng rất có thể hướng đẫn tên cửa hàng dữ liệu có tác dụng tsay mê số trong cách làm khởi tạo cửa hàng của lớp Context.

Nếu chúng ta hướng dẫn và chỉ định tmê say số tên cửa hàng dữ liệu, thì Code First sẽ khởi tạo cửa hàng dữ liệu cùng với tên các bạn đang hướng dẫn và chỉ định vào thủ tục khởi chế tác đại lý vào sever cơ sở tài liệu SQLEXPRESS cục bộ.

ví dụ như, Code First sẽ tạo nên cơ sở 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

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

Hãy chú ý ví dụ sau khu vực họ truyền tsi mê số name=SchoolDBConnectionString vào phương thức khởi chế tạo ra các đại lý.

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

Trong lớp Context sinh hoạt trên, Cửa Hàng chúng tôi chỉ định và hướng dẫn tên chuỗi kết nối làm cho tmê say số. Xin lưu ý rằng thương hiệu chuỗi liên kết đề xuất bước đầu bằng "name =", nếu không, nó vẫn coi nó là tên gọi cơ sở dữ liệu.

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

Đảm bảo rằng chúng ta gồm ở trong tính providerName="System.Data.SqlClient" cho cửa hàng tài liệu SQL Server vào chuỗi liên kết.

Chiến lược khởi sinh sản cơ sở dữ liệu

quý khách đang chế tác cửa hàng dữ liệu sau khoản thời gian chạy vận dụng Code First lần thứ nhất, nhưng mà lần trang bị nhì trnghỉ ngơi đi thì sao? Nó sẽ tạo nên ra một các đại lý dữ liệu bắt đầu mỗi khi chúng ta chạy ứng dụng?

Còn môi trường xung quanh Production thì sao? Làm cầm như thế nào nhằm bạn cập nhật cơ sở tài liệu khi chúng ta chuyển đổi mô hình miền của bạn?

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

Có bốn chiến lược khởi tạo ra cửa hàng tài liệu không giống nhau trong Code First:

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

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

Bạn có thể kiến thiết những lớp thực thể của bản thân bằng phương pháp áp dụng tính thừa kế trong C#.

Trong thiết kế hướng đối tượng người dùng, các lớp có quan hệ "has a" cùng "is a", trong lúc đó quy mô quan hệ nam nữ dựa trên Squốc lộ chỉ tất cả quan hệ "has a" giữa các bảng.

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

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

Table per Hierarchy (TPH): Cách tiếp cận này đề nghị tạo nên một bảng chung mang lại toàn cục các phần bên trong phân cấp thừa kế. Bảng này còn có một cột để riêng biệt thân các lớp bé. Đây là 1 trong chiến lược ánh xạ thừa kế mặc định vào Entity Framework.Table per Type (TPT): Cách tiếp cận này kiến nghị sinh sản mỗi bảng mang đến từng lớp bên trong phân cấp cho kế thừa (sinh sản bảng cho cả lớp phụ vương cùng lớp con).Table per Concrete Class (TPC): Cách tiếp cận này đề nghị tạo ra mỗi bảng mang đến từng lớp con trong phân cung cấp kế thừa, tuy thế không chế tác bảng cho lớp cha. Vì vậy những nằm trong tính của lớp thân phụ vẫn là 1 phần của từng bảng của lớp con.

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


Trung Nguyenlondonrocknroll.com
*

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

Code First xuất bản quy mô định nghĩa trường đoản cú các lớp thực thể của người tiêu dùng bằng phương pháp áp dụng các quy ước mang định.

EF 6 Code First tận dụng tối đa một mẫu mã xây dựng được điện thoại tư vấn là quy ước về thông số kỹ thuật. Tuy nhiên, chúng ta có thể ghi đnai lưng các quy ước này bằng cách thông số kỹ thuật các lớp thực thể của doanh nghiệp nhằm hỗ trợ mang lại EF báo cáo quan trọng.

Có nhị cách để cấu hình những lớp thực thể của bạn:

Attribute chú thích dữ liệu.Fluent API.

Attribute chú giải dữ liệu

Chụ say mê dữ liệu là 1 trong những cấu hình dựa trên attribute dễ dàng, bạn có thể vận dụng cho các lớp và trực thuộc tính của nó.

Các attribute này không chỉ có giành riêng cho EF bên cạnh đó được sử dụng vào ASP..NET Web Form cùng ASPhường.NET MVC. Do đó, bọn chúng được đặt trong một namespace đơn nhất là System.ComponentModel.DataAnnotations.

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


Trung Nguyenlondonrocknroll.com

Fluent API

Một biện pháp khác để định thông số kỹ thuật các lớp là bằng phương pháp thực hiện Entity Framework Fluent API. Fluent API dựa trên chủng loại xây dựng Fluent API (xuất xắc còn gọi là đồ họa thông thạo) trong các số ấy tác dụng được chế tạo thành xuất phát điểm từ 1 chuỗi cách thức.

Cấu hình Fluent API rất có thể được vận dụng Lúc EF xây dừng mô hình tự những lớp thực thể của người sử dụng. quý khách rất có thể thêm những cấu hình Fluent API bằng phương pháp ghi đè cổ phương thức OnModelCreating của lớp DbContext trong Entity Framework 6.x, như được trình bày 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 domain classes using modelBuilder here.. Bạn rất có thể thực hiện tsay mê số modelBuilder, một đối tượng người tiêu dùng của lớp DbModelBuilder nhằm thông số kỹ thuật các lớp thực thể của khách hàng. DbModelBuilder được Gọi là Fluent API bởi chúng ta có thể Gọi các cách làm khác nhau trong một chuỗi cách tiến hành.

Tìm gọi cụ thể về Fluent API vào Entity Framework tại nội dung bài viết này:


Cấu hình quan hệ vào Code First

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

Khóa ngoại (Foreign Key) là một cột hoặc tổng hợp những cột được thực hiện nhằm cấu hình thiết lập với xúc tiến một links giữa dữ liệu vào hai bảng.

Có ba loại mối quan hệ giữa các bảng và bọn chúng khác nhau tùy ở trong vào bí quyết định nghĩa những cột liên quan.

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

Để hiểu rõ cách cấu hình các mối quan hệ giữa những thực thể trong Entity Framwork Code First bạn có thể xem bài bác viết:


Migration vào Code First

Entity Framework Code First gồm những kế hoạch khởi tạo thành đại lý dữ liệu khác biệt nhỏng CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges, và DropCreateDatabaseAlways.

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

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

Entity Framework đã giới thiệu một pháp luật migration tự động cập nhật lược đồ dùng cửa hàng dữ liệu khi mô hình của khách hàng biến đổi cơ mà không mất bất kỳ tài liệu hiện tất cả hoặc các đối tượng người sử dụng cơ sở dữ liệu khác. Nó sử dụng một trình khởi tạo các đại lý tài liệu new hotline là MigrateDatabaseToLatestVersion.

Xem thêm: Tiểu Sử Trấn Thành: Gia Thế, Sự Nghiệp Và Tình Cảm Của Nam Diễn Viên

Có nhì một số loại Migration:

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

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


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

Ở phần này, bạn sẽ mày mò bí quyết tạo thành Context cùng các lớp thực thể từ bỏ cửa hàng tài liệu gồm sẵn, thực hiện cách thức tiếp cận Code First.

Entity Framework cung ứng một biện pháp đơn giản và dễ dàng để sử dụng Code First cho các đại lý dữ liệu có sẵn. Nó sẽ tạo nên các lớp thực thể mang lại toàn bộ các bảng và view trong cửa hàng dữ liệu ngày nay của công ty và cấu hình chúng cùng với những attribute chú thích tài liệu cùng Fluent API.

Để thực hiện Code First mang đến đại lý dữ liệu bao gồm sẵn, nhấp chuột cần vào dự án công trình của khách hàng vào Visual Studio -> Add -> New Item..

*

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

*

Vấn đề này vẫn mở trình khuyên bảo Entity Data Model nhỏng tiếp sau đây. Chọn Code First from database với nhận Next.

*

Bây giờ đồng hồ, chọn kết nối tài liệu mang đến đại lý tài liệu hiện tại tất cả. Tạo liên kết new đến đại lý tài liệu của doanh nghiệp nếu như danh sách thả xuống không bao hàm kết nối cho đại lý dữ liệu bây giờ của công ty. Nhấn Next nhằm liên tục.

*

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

*

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

*

Nó cũng trở thành tạo ra lớp Context sau áp dụng Fluent API để thông số kỹ thuật các lớp thực thể theo đại lý dữ liệu của chúng ta.

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 đang tự động hóa xóa các bạn dạng ghi dựa vào hoặc tùy chỉnh thiết lập những cột khóa ngoài thành phố null lúc bạn dạng ghi phụ thân bị xóa vào cơ sở dữ liệu.

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

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

Hãy coi ví dụ sau đây: các thực thể Student và StudentAddress tất cả mối 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ụ như tiếp sau đây minc 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 & its address will be removed from db ctx.SaveChanges();Trong ví dụ trên, trước tiên EF lưu giữ đối tượng người dùng stud của thực thể Student cùng đối tượng add của thực thể StudentAddress của nó vào cơ sở tài liệu.

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

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

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

Hãy coi ví dụ sau đây: các thực thể Student cùng Standard gồm 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; lấy ví dụ như sau đây minc họa cascade delete thân những thực thể gồm 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 & standard1 into lớn db ctx.SaveChanges(); //deletes standard1 from db và also phối standard_StandardId FK column in Students table khổng lồ 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 ngoài các đại lý tài liệu và nó cũng tùy chỉnh thiết lập cột khóa ngoại standard_StandardId vào bảng Students thành null mang đến tất cả các phiên bản ghi tmê mẩn chiếu đối tượng người dùng standard1.

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

Do đó, EF cho phép cascade delete khoác định cho tất cả những thực thể.

Tắt Cascade Delete

Sử dụng Fluent API để thông số kỹ thuật tắt cascade delete cho những thực thể nhằm bằng cách thức WillCascadeOnDelete(), nlỗi 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 chú giải dữ liệu nào bao gồm sẵn để tắt cascade delete.

Sử dụng Stored Procedures trong Code First

Entity Framework 6 Code First cung cấp tài năng tạo và thực hiện stored procedure nhằm triển khai các làm việc thêm, cập nhật và xóa Lúc hotline cách thức SaveChanges().

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

*

Các stored procedure Student_Insert với Student_Update có những tmê say số mang đến tất cả những nằm trong tính của thực thể Student. Riêng stored procedure Student_Delete chỉ gồm một ttê mê số cho ở 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 cấu hình cho 1 thực thể

EF 6 chất nhận được các bạn sử dụng những stored procedure tùy chỉnh thiết lập của riêng biệt các bạn cùng ánh xạ bọn chúng cho tới một thực thể. quý khách hàng cũng rất có thể thông số kỹ thuật ánh xạ tsi số với các thuộc tính của thực thể.

lấy ví dụ sau ánh xạ những 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ạ tới những stored procedure sp_InsertStudent, sp_UpdateStudent và sp_DeleteStudent. Nó cũng cấu hình ánh xạ thân các tmê mẩn số và nằm trong tính của thực thể.

Sử dụng stored procedure đến tất cả các thực thể

Bạn rất có thể ánh xạ tất cả những thực thể của bản thân mình cùng với các stored procedure khoác định vào 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ằm ánh xạ những stored procedure. Không tất cả attribute chú giải dữ liệu làm sao có sẵn vào EF 6 nhằm ánh xạ stored procedure.Quý Khách buộc phải ánh xạ các stored procedure thêm, update và xóa cho 1 thực thể ví như bạn muốn sử dụng stored procedure cho những chuyển động CUD. Ánh xạ có một trong những những thao tác CUD là ko được phnghiền.

Chuyển cấu hình Fluent API sang trọng một tấm riêng rẽ vào Code First

Nlỗi chúng ta đã thấy trong những trả lời trước, Cửa Hàng chúng tôi đang cấu hình toàn bộ các lớp thực thể bởi Fluent API trong cách thức OnModelCreating().

Tuy nhiên, nó trnghỉ ngơi cần nặng nề gia hạn nếu như khách hàng cấu hình một số trong những lượng to những lớp thực thể trong OnModelCreating.

EF 6 được cho phép bạn tạo nên một tờ riêng mang đến từng thực thể với đặt tất cả những thông số kỹ thuật tương quan mang lại thực thể vào lớp đó.

Hãy xem ví dụ sau chỗ chúng ta 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ể di chuyển toàn bộ những cấu hình tương quan mang đến thực thể Student quý phái một tờ riêng gồm bắt đầu trường đoản cú EntityTypeConfiguration.

Hãy coi lớp StudentEntityConfigurations sau bao hàm toàn bộ các cấu hình 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"); ); Nlỗi bạn có thể thấy sinh hoạt bên trên, công ty chúng tôi sẽ gửi toàn bộ những cấu hình cho thực thể Student vào cách làm khởi tạo ra của lớp StudentEntityConfiguration, gồm bắt đầu từ bỏ EntityTypeConfiguration.

Bây giờ, bạn phải thêm lớp thông số kỹ thuật cấu hình thiết lập này sử dụng Fluent API, nlỗi 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 kia, bạn cũng có thể sử dụng những lớp thông số kỹ thuật nhằm tăng kĩ năng hiểu cùng duy trì.

Seed Data vào Code-First

quý khách có thể chèn tài liệu vào những bảng các đại lý dữ liệu của bản thân vào quy trình khởi tạo thành các đại lý dữ liệu. Điều này sẽ khá quan trọng đặc biệt nếu bạn muốn hỗ trợ một trong những tài liệu thử nghiệm mang đến áp dụng của chúng ta hoặc một số tài liệu chính mang định đến vận dụng của chúng ta.

Để tạo thành dữ liệu vào đại lý tài liệu của bạn, chúng ta phải tạo lập một trình khởi chế tạo ra DB cấu hình thiết lập, nlỗi chúng ta sẽ chế tạo vào chương Khởi tạo ra cơ sở tài liệu và ghi đnai lưng cách làm Seed.

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

quý khách hàng vẫn khám phá 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 ứng kĩ năng tư tưởng các quy ước thiết lập của riêng biệt các bạn.

Có nhì một số loại quy ước chính: Quy ước cấu hình cùng Quy ước quy mô.

Quy ước cấu hình

Quy ước thông số kỹ thuật là 1 trong những cách để thông số kỹ thuật các thực thể nhưng không ghi đè cổ cấu hình mang định được cung ứng trong Fluent API.

quý khách hàng có thể quan niệm một quy ước cấu hình vào cách thức OnModelCreating() cùng cả trong lớp tùy chỉnh, giống như như biện pháp các bạn sẽ có mang ánh xạ thực thể thường thì với Fluent API.

Ví dụ: bạn muốn thông số kỹ thuật một thuộc tính làm cho ở trong tính khóa mang tên khớp với thương hiệu thực thể_ID, ví dụ: nằm trong tính Student_ID của thực thể Student vẫn là khóa chính. Sau trên đây định nghĩa 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 giải pháp, bạn cũng có thể có mang quy ước cho kích thước của hình dáng tài liệu.

lấy ví dụ như sau đây định nghĩa một quy ước cho các ở trong tính chuỗi. Nó sẽ khởi tạo những cột nvarchar có kích thước 50 trong SQL Server cho toàn bộ những nằm trong tính kiểu dáng 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 có thể khái niệm một tờ tùy chỉnh cho quy ước này bằng phương pháp kế thừa lớp Convention, nhỏng ví dụ bên 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 sản xuất lớp quy ước cấu hình thiết lập, hãy thêm nó vào các quy ước nlỗi dưới đây:

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

Quy ước mô hình

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

Tạo một lớp thực thi interface IConceptualModelConvention trường đoản cú các quy ước DataBase cùng IStoreModelConvention từ bỏ những quy ước SSDL.

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *