CODE FIRST LÀ GÌ

Code First là gì?

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

Bạn đang xem: Code first là gì

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

*

Nlỗi chúng ta cũng có thể thấy trong hình bên trên, Entity Framework API sẽ khởi tạo cửa hàng dữ liệu dựa vào cấu hình với các lớp miền của khách hàng. Vấn đề này có nghĩa là bạn cần bước đầu viết code trước bằng C# hoặc VB.NET cùng tiếp đến Entity Framework (EF) sẽ tạo các đại lý dữ liệu từ bỏ code của người sử dụng.

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

Hình sau đây minh họa quá trình trở nên tân tiến Code First.

*

Quy trình cải cách và phát triển theo cách tiếp cận Code First đã 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 các thuộc tính chú giải dữ liệu hoặc Fluent API -> Tạo hoặc update lược thứ đạ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à những cỗ phép tắc 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 bạn Lúc làm việc cùng với phương pháp tiếp cận Code First.

Nlỗi chúng ta đã thấy vào ví dụ sống trên, Entity Framework API đang cấu hình các khóa bao gồm, khóa nước ngoài, những mối quan hệ, kiểu dáng dữ liệu của cột, v.v. trường đoản cú các lớp miền cơ mà không cần thông số kỹ thuật bổ sung cập nhật.

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

Các quy ước trong Entity Framework 6.x Code First được quan niệm trong namespace System.Data.Entity.ModelConfiguration.Conventions .

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


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

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


Kiểu dữ liệu C#Ánh xạ tới dạng hình 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 nhẹm ra exception)
objectKhông ánh xạ

Hình dưới đây minc họa ánh xạ quy ước cùng với cửa hàng tài liệu.

*

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

Entity Framework 6 sản xuất quan hệ một-nhiều bằng phương pháp sử dụng trực 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 cụ thể vào nội dung bài viết khác.

Lưu ý: Entity Framework 6 không có những quy ước mặc định cho các quan hệ một-một với nhiều-các. Bạn đề nghị thông số kỹ thuật chúng bằng Fluent API hoặc DataAnnotation.

Quy ước kiểu dáng phức tạp

Code First sản xuất hình trạng phức hợp đến lớp không bao hàm trực thuộc tính khóa và khóa bao gồm ko được đăng ký bởi thuộc tính DataAnnotation hoặc Fluent API.

Phần này trình diễn tổng quan tiền về những quy ước trong Code First. Các quy ước này hoàn toàn có thể được ghi đè cổ bằng các sử dụng nằm trong tính DataAnnotation hoặc Fluent API.

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

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

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

*

Tsay mê số khởi sản xuất các đại lý dữ liệu

Theo hình trên, cách làm khởi sinh sản các đại lý của lớp Context hoàn toàn có thể có tyêu thích số sau:

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

Không gồm tđê mê số

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

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

namespace SchoolDataLayer public class Context: DbContext public Context(): base() Tên cửa hàng dữ liệu

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

Nếu các bạn chỉ định và hướng dẫn tđắm say số thương hiệu cửa hàng tài liệu, thì Code First sẽ tạo cửa hàng tài liệu cùng với tên các bạn sẽ chỉ định và hướng dẫn trong cách làm khởi sản xuất cơ sở trong sever cơ sở dữ liệu SQLEXPRESS toàn bộ.

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

Hãy chu đáo ví dụ sau vị trí chúng ta truyền tmê say số name=SchoolDBConnectionString trong thủ tục khởi tạo ra đại lý.

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

Trong lớp Context làm việc bên trên, Shop chúng tôi hướng dẫn và chỉ định tên chuỗi liên kết làm cho tsi số. Xin chú ý rằng tên chuỗi liên kết buộc phải bắt đầu bởi "name =", nếu không, nó vẫn coi nó là tên các đại lý tài liệu.

Tên cửa hàng tài liệu trong chuỗi liên kết trong App.config là SchoolDB. Entity Framework (EF) sẽ tạo cửa hàng dữ liệu SchoolDB mới hoặc thực hiện cửa hàng dữ liệu SchoolDB hiện nay gồm trong SQL Server cục bộ.

Đảm nói rằng bạn gồm ở trong tính providerName="System.Data.SqlClient" mang đến cửa hàng dữ liệu Squốc lộ Server vào chuỗi kết nối.

Chiến lược khởi chế tác các đại lý dữ liệu

quý khách hàng đang tạo cơ sở dữ liệu sau khoản thời gian chạy áp dụng Code First lần thứ nhất, tuy nhiên lần thứ hai trsống đi thì sao? Nó sẽ khởi tạo ra một cửa hàng tài liệu new mỗi khi bạn chạy ứng dụng?

Còn môi trường thiên nhiên Production thì sao? Làm cố kỉnh như thế nào nhằm chúng ta update đại lý dữ liệu khi chúng ta biến đổi quy mô miền của bạn?

Để cách xử lý những kịch phiên bản này, bạn cần áp dụng một trong những kế hoạch khởi sản xuất cơ sở dữ liệu.

Có bốn chiến lược khởi chế tạo ra các đại lý tài liệu khác biệt vào Code First:

CreateDatabaseIfNotExists: Đây là trình khởi tạo nên mặc định. Như tên thường gọi, nó sẽ khởi tạo các đại lý dữ liệu còn nếu như không mãi sau theo cấu hình. Tuy nhiên, nếu khách hàng biến đổi lớp quy mô và kế tiếp chạy áp dụng cùng với trình khởi chế tác này, thì nó sẽ chỉ dẫn một nước ngoài lệ.DropCreateDatabaseIfModelChanges: Trình khởi chế tạo ra này xóa đại lý dữ liệu hiện nay tất cả với chế tạo ra các đại lý dữ liệu new, giả dụ các lớp quy mô của người sử dụng (các lớp thực thể) đã biết thành đổi khác. Vì vậy, bạn không phải lo lắng về vấn đề gia hạn lược vật các đại lý tài liệu của bản thân mình, khi những lớp mô hình của khách hàng chuyển đổi.DropCreateDatabaseAlways: Nlỗi tên cho thấy thêm, trình khởi tạo này đã xóa đại lý dữ liệu hiện bao gồm từng khi chúng ta chạy vận dụng, bất kỳ các lớp quy mô của doanh nghiệp tất cả biến hóa hay không. Điều này đã có lợi Khi bạn có nhu cầu tất cả một cửa hàng dữ liệu mới từng khi bạn chạy áp dụng, ví dụ như khi chúng ta vẫn cải tiến và phát triển vận dụng.Trình khởi chế tạo đạ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 sinh sản thiết lập cấu hình của riêng rẽ mình, giả dụ các biện pháp bên trên không thỏa mãn nhu cầu thưởng thức của doanh nghiệp hoặc bạn có nhu cầu tiến hành một số trong những tiến trình không giống để có thể tạo cơ sở tài liệu bằng trình khởi tạo ra ở trên.
Cách Code First auto khởi chế tạo ra các đại lý dữ liệu trong Entity Framework. Các kế hoạch khởi chế tác đại lý dữ liệu vào EF.
Trung Nguyenlongky.mobi
*

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

Quý Khách hoàn toàn có thể thi công các lớp thực thể của mình bằng cách thực hiện tính kế thừa vào C#.

Trong lập trình phía đối tượng, các lớp gồm quan hệ "has a" cùng "is a", trong những lúc kia mô hình quan hệ giới tính dựa trên Squốc lộ chỉ gồm quan hệ "has a" giữa các bảng.

Hệ quản trị cơ sở tài liệu SQL ko hỗ trợ mối quan hệ "is a". Vì vậy, có tác dụng nỗ lực như thế nào bạn có thể ánh xạ những lớp thực thể tất cả quan hệ "is a" vào cơ sở tài liệu quan tiền 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 các đại lý dữ liệu vào Code First:

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

Xem cụ thể cha cách tiếp cạn để anh xạ kế thừa vào cửa hàng tài liệu vào Code First:


Trung Nguyenlongky.mobi
*

Cấu hình những lớp bên trong Entity Framework

Code First xây đắp mô hình tư tưởng tự các lớp thực thể của công ty bằng phương pháp áp dụng những quy ước mặc định.

EF 6 Code First tận dụng một mẫu mã xây dựng được hotline là quy ước về thông số kỹ thuật. Tuy nhiên, chúng ta cũng có thể ghi đtrần 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 khách hàng nhằm cung ứng đến EF biết tin cần thiết.

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

Attribute chú giải dữ liệu.Fluent API.

Attribute ghi chú dữ liệu

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

Các attribute này không chỉ là giành riêng cho EF ngoài ra được áp dụng vào ASPhường.NET Web Form cùng ASPhường.NET MVC. Do kia, bọn chúng được đặt vào một namespace riêng lẻ là System.ComponentModel.DataAnnotations.

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


Trung Nguyenlongky.mobi

Fluent API

Một phương pháp không giống để định cấu hình những lớp là bằng cách sử dụng Entity Framework Fluent API. Fluent API dựa vào mẫu thiết kế Fluent API (tuyệt còn được gọi là giao diện thông thạo) trong số ấy công dụng được tạo nên thành xuất phát từ một chuỗi cách làm.

Cấu hình Fluent API có thể được vận dụng Khi EF xuất bản mô hình trường đoản cú các lớp thực thể của khách hàng. quý khách hàng có thể thêm những thông số kỹ thuật Fluent API bằng phương pháp ghi đè cổ cách làm 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 hoàn toàn có thể áp dụng tđê mê số modelBuilder, một đối tượng người tiêu dùng của lớp DbModelBuilder nhằm cấu hình những lớp thực thể của khách hàng. DbModelBuilder được Call là Fluent API do chúng ta có thể gọi các cách tiến hành khác nhau trong một chuỗi cách làm.

Tìm gọi chi tiết về Fluent API vào Entity Framework trên 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à một links mãi sau giữa các bảng của cơ sở tài liệu tình dục thông qua những 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 áp dụng nhằm cấu hình thiết lập và triển khai một liên kết thân dữ liệu vào nhị bảng.

Có ba các loại quan hệ giữa các bảng với chúng khác nhau tùy nằm trong vào bí quyết khái niệm những cột tương quan.

Mối quan hệ một-nhiềuMối quan hệ giới tính nhiều-nhiềuMối quan hệ nam nữ một-một

Để làm rõ phương pháp thông số kỹ thuật những quan hệ giữa các thực thể trong Entity Framwork Code First bạn cũng có thể xem bài bác viết:


Migration vào Code First

Entity Framework Code First gồm những chiến lược khởi chế tác đại lý dữ liệu không giống nhau nlỗi CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges, với DropCreateDatabaseAlways.

Tuy nhiên, có một số sự việc với những kế hoạch này, ví dụ: nếu bạn đã sở hữu tài liệu (trừ seed data - tài liệu thuở đầu đạt thêm bởi code) hoặc stored procedures, triggers, v.v. vào cửa hàng tài liệu của công ty.

Các chiến lược này được áp dụng nhằm vứt bỏ cục bộ các đại lý tài liệu với chế tạo lại nó, cho nên vì vậy bạn sẽ mất tài liệu cùng những đối tượng người tiêu dùng DB không giống.

Entity Framework đang giới thiệu một phương tiện migration auto update lược vật dụng các đại lý tài liệu Lúc quy mô của doanh nghiệp chuyển đổi nhưng ko mất bất kỳ dữ liệu hiện tại tất cả hoặc các đối tượng người sử dụng cửa hàng dữ liệu khác. Nó áp dụng một trình khởi sản xuất các đại lý dữ liệu bắt đầu Call là MigrateDatabaseToLatestVersion.

Xem thêm: Lịch Nghỉ Giỗ Tổ, 30/4 1/5 Là Ngày Gì ? Năm Nay Được Nghỉ Lễ Mấy Ngày?

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

Migration tự động.Migration dựa trên mã.

Để nắm rõ về nhì một số loại Migration vào Code First chúng ta 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 trong Code First

Ở phần này, các bạn sẽ tìm hiểu giải pháp chế tạo ra Context và những lớp thực thể trường đoản cú cơ sở tài liệu gồm sẵn, áp dụng phương thức tiếp cận Code First.

Entity Framework cung ứng một bí quyết dễ dàng nhằm thực hiện Code First cho cơ sở tài liệu có sẵn. Nó sẽ tạo nên những lớp thực thể mang lại toàn bộ những bảng cùng view trong đại lý tài liệu hiện tại của khách hàng cùng 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.

Để áp dụng Code First mang đến cửa hàng tài liệu tất cả sẵn, nhấn vào phải vào dự án công trình của công ty vào Visual Studio -> Add -> New Item..

*

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

*

Vấn đề này đang msinh hoạt trình trả lời Entity Data Model như tiếp sau đây. Chọn Code First from database cùng dấn Next.

*

Bây giờ đồng hồ, lựa chọn kết nối tài liệu cho cơ sở tài liệu hiện tất cả. Tạo liên kết bắt đầu cho đại lý tài liệu của công ty ví như list thả xuống ko bao hàm liên kết đến đại lý tài liệu bây chừ của người tiêu dùng. Nhấn Next nhằm tiếp tục.

*

Bây tiếng, lựa chọn các bảng cùng view mà bạn có nhu cầu chế tạo ra các lớp thực thể với nhấp vào Finish.

*

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

*

Nó cũng trở thành sản xuất lớp Context sau sử dụng Fluent API nhằm cấu hình các lớp thực thể theo đạ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 trong Code First

Cascade Delete đang tự động hóa xóa những bạn dạng ghi phụ thuộc hoặc tùy chỉnh thiết lập các cột khóa ngoại thành null lúc bạn dạng ghi phụ vương bị xóa vào các đại lý tài liệu.

Cascade Delete được nhảy theo mang định trong Entity Framework cho tất cả những các loại quan hệ, chẳng hạn như một-một, một-các cùng nhiều-những.

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

Hãy coi ví dụ sau đây: những thực thể Student với StudentAddress gồm 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 một ví dụ sau đây minch 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ụ bên trên, thứ nhất EF lưu lại đối tượng stud của thực thể Student cùng đối tượng người tiêu dùng add của thực thể StudentAddress của nó vào cơ sở dữ liệu.

Sau đó, khi xóa đối tượng người tiêu dùng stud cùng hotline thủ tục SaveChanges(), EF đã xóa stud cũng như bạn dạng ghi khớp ứng của chính nó trong bảng StudentAddresses.

Do đó, EF chất nhận được cascade delete theo mặ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à Standard tất cả mối 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; lấy ví dụ như tiếp sau đây minc họa cascade delete giữa các 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 và standard1 inlớn db ctx.SaveChanges(); //deletes standard1 from db và also phối standard_StandardId FK column in Students table 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 sử dụng standard1 khỏi các đại lý dữ liệu và nó cũng thiết lập cột khóa ngoại standard_StandardId trong bảng Students thành null đến tất cả những phiên bản ghi tham mê chiếu đối tượng standard1.

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

Do kia, EF cho phép cascade delete khoác định mang lại toàn bộ những thực thể.

Tắt Cascade Delete

Sử dụng Fluent API để cấu hình tắt cascade delete cho các thực thể nhằm bởi cách thức 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 gồm attribute ghi chú tài liệu như thế nào bao gồm sẵn nhằm tắt cascade delete.

Sử dụng Stored Procedures trong Code First

Entity Framework 6 Code First cung ứng kĩ năng sinh sản cùng thực hiện stored procedure nhằm triển khai những làm việc thêm, update cùng xóa Lúc gọi phương thức SaveChanges().

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

*

Các stored procedure Student_Insert và Student_Update bao gồm các tham số đến tất cả những thuộc tính của thực thể Student. Riêng stored procedure Student_Delete chỉ bao gồm một ttê mê số mang lại thuộc tính khóa chính StudentId của thực thể Student. Sau đó 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 1 thực thể

EF 6 được cho phép bạn áp dụng những stored procedure thiết lập cấu hình của riêng biệt các bạn cùng ánh xạ chúng tới một thực thể. Quý Khách cũng rất có thể cấu hình ánh xạ tmê mệt số với những trực thuộc tính của thực thể.

ví dụ như sau ánh xạ những stored procedure tùy chỉ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 cùng sp_DeleteStudent. Nó cũng thông số kỹ thuật ánh xạ thân các tmê man số với thuộc tính của thực thể.

Sử dụng stored procedure mang đến toàn bộ những thực thể

quý khách hàng có thể ánh xạ tất cả các thực thể của mình cùng với các stored procedure khoác định vào một câu lệnh nlỗi dưới đâ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ạ các stored procedure. Không bao gồm attribute chú thích dữ liệu nào bao gồm sẵn vào EF 6 để ánh xạ stored procedure.quý khách hàng cần ánh xạ các stored procedure thêm, update cùng xóa cho một thực thể ví như bạn muốn sử dụng stored procedure cho những chuyển động CUD. Ánh xạ chỉ một trong những các thao tác làm việc CUD là không được phnghiền.

Chuyển cấu hình Fluent API lịch sự một tờ riêng trong Code First

Nlỗi chúng ta đã thấy trong các lý giải trước, chúng tôi vẫn cấu hình toàn bộ các lớp thực thể bằng Fluent API vào cách thức OnModelCreating().

Tuy nhiên, nó trngơi nghỉ đề nghị cạnh tranh gia hạn nếu như bạn thông số kỹ thuật một số trong những lượng mập những lớp thực thể trong OnModelCreating.

EF 6 chất nhận được chúng ta chế tác một lớp riêng rẽ cho từng thực thể cùng đặt tất cả các thông số kỹ thuật tương quan mang lại thực thể trong lớp đó.

Hãy coi ví dụ sau khu vực bọn 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ờ, chúng ta có thể dịch rời tất cả các thông số kỹ thuật liên quan đến thực thể Student quý phái một lớp riêng rẽ bao gồm nguồn gốc tự EntityTypeConfiguration.

Hãy xem lớp StudentEntityConfigurations sau bao hàm toàn bộ những cấu hình đế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ỏng chúng ta có thể thấy làm việc trên, Shop chúng tôi đã gửi toàn bộ những cấu hình mang lại thực thể Student vào cách làm khởi tạo thành của lớp StudentEntityConfiguration, có bắt đầu từ bỏ EntityTypeConfiguration.

Bây tiếng, bạn phải thêm lớp thông số kỹ thuật tùy chỉnh này sử 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 to StudentEntityConfiguration class modelBuilder.Configurations.Add(new StudentEntityConfiguration()); Do kia, chúng ta cũng có thể thực hiện các lớp cấu hình để tăng kĩ năng gọi và gia hạn.

Seed Data trong Code-First

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

Để chế tác tài liệu vào các đại lý tài liệu của doanh nghiệp, các bạn phải tạo một trình khởi sản xuất DB tùy chỉnh, như các bạn vẫn chế tác trong chương thơm Khởi sinh sản các đại lý tài liệu và ghi đtrần cách làm Seed.

lấy ví dụ dưới đây cho biết thêm giải pháp chúng ta cũng có thể cung ứng tài liệu mang định cho bảng Standard trong những khi khởi sinh sản các đại lý dữ 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 nên 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 thiết lập cấu hình vào Code First

Quý Khách đang khám phá về các quy ước vào Code First trong phần đầu của nội dung bài viết. EF 6 cũng cung cấp tài năng tư tưởng những quy ước thiết lập cấu hình của riêng chúng ta.

Có nhì các loại quy ước chính: Quy ước thông số kỹ thuật với Quy ước mô hình.

Quy ước cấu hình

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

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

Ví dụ: bạn muốn cấu hình một nằm trong tính có tác dụng ở trong tính khóa có tên khớp cùng với thương hiệu thực thể_ID, ví dụ: trực thuộc tính Student_ID của thực thể Student đã là khóa bao gồm. Sau trên đây 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 và một giải pháp, chúng ta có thể quan niệm quy ước mang lại form size của phong cách dữ liệu.

lấy một ví dụ sau đây tư tưởng một quy ước cho những nằm trong tính chuỗi. Nó sẽ tạo các cột nvarchar gồm form size 50 trong Squốc lộ Server mang lại toàn bộ những nằm trong tính hình trạ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);Bạn cũng hoàn toàn có thể tư tưởng một tờ thiết lập mang đến quy ước này bằng phương pháp thừa kế 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 Khi chế tạo ra lớp quy ước tùy chỉnh cấu hình, hãy thêm nó vào những quy ước nlỗi bên dưới đây:

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

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

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

Tạo một tờ tiến hành interface IConceptualModelConvention từ bỏ những quy ước DataBase cùng IStoreModelConvention trường đoản cú các quy ước SSDL.