ENTITY FRAMEWORK CODE FIRST LÀ GÌ

  -  

Code First là gì?

Entity Framework đang ra mắt biện pháp tiếp cận Code First vào Entity Framework 4.1. Code First hầu hết hữu dụng trong Thiết kế hướng domain name.

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

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

*

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

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

Hình dưới đây minc họa các bước 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 sẽ là: Tạo hoặc sửa đổi các lớp miền -> thông số kỹ thuật những lớp miền này bởi các nằm trong tính chú thích tài liệu hoặc Fluent API -> Tạo hoặc cập nhật lược thứ cửa hàng tài liệu bởi automated migration hoặc code-based migration.

Các quy ước trong Code First

Các quy ước là các cỗ nguyên tắc mặc định tự động thông số kỹ thuật một mô hình tư tưởng dựa trên những lớp miền của doanh nghiệp khi thao tác cùng với cách tiếp cận Code First.

Nhỏng các bạn vẫn thấy vào ví dụ ngơi nghỉ bên trên, Entity Framework API đang thông số kỹ thuật những khóa chủ yếu, khóa ngoại, những mối quan hệ, giao diện dữ liệu của cột, v.v. trường đoản cú các lớp miền nhưng mà ko đề nghị thông số kỹ thuật bổ sung.

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 công ty theo đúng những quy ước thì lược thứ cửa hàng dữ liệu sẽ được cấu hình dựa vào những quy ước này.

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

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


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

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


Kiểu dữ liệu C#Ánh xạ tới hình trạng tài 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ơ sở tài liệu.

*

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

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

Lưu ý: Entity Framework 6 không tồn tại những quy ước khoác định cho các mối quan hệ một-một cùng nhiều-những. quý khách đề nghị cấu hình chúng bằng Fluent API hoặc DataAnnotation.

Quy ước vẻ bên ngoài phức tạp

Code First tạo nên kiểu dáng phức tạp mang đến lớp ko bao hàm trực thuộc tính khóa với khóa thiết yếu không được đăng ký bởi ở trong tính DataAnnotation hoặc Fluent API.

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

Khởi sinh sản cơ sở dữ liệu trong Code First

Tại phần này, bọn họ đã tìm hiểu giải pháp Entity Framework ra quyết định thương hiệu cửa hàng tài liệu cùng máy chủ trong lúc khởi sinh sản cửa hàng dữ liệu Theo phong cách tiếp cận Code First.

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

*

Tham mê số khởi sinh sản cơ sở dữ liệu

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

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

Không tất cả tsi số

Nếu chúng ta không chỉ định tđam mê số trong thủ tục khởi tạo các đại lý của lớp Context thì nó sẽ tạo nên các đại lý tài liệu trong sever SQLEXPRESS tổng thể của chúng ta 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ác đại lý 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 đại lý dữ liệu

quý khách hàng cũng hoàn toàn có thể hướng đẫn tên đại lý tài liệu làm tham mê số trong cách thức khởi tạo nên đại lý của lớp Context.

Nếu bạn hướng dẫn và chỉ định tham số thương hiệu cửa hàng dữ liệu, thì Code First sẽ tạo đại lý tài liệu với thương hiệu các bạn vẫn hướng đẫn trong cách tiến hành khởi tạo thành cơ sở vào máy chủ các đại lý tài liệu SQLEXPRESS cục bộ.

lấy ví dụ như, Code First sẽ tạo cơ sở dữ liệu mang 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

Bạn cũng rất có thể chỉ định chuỗi liên kết vào phầm mềm.config hoặc web.config và chỉ định thương hiệu chuỗi liên kết bước đầu bằng "name =" vào phương thức khởi chế tạo ra cơ sở của lớp Context.

Hãy chăm chú ví dụ sau địa điểm bọn họ truyền tsi số name=SchoolDBConnectionString trong cách tiến hành khởi chế tác đại lý.

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

Trong lớp Context sống bên trên, Shop chúng tôi hướng dẫn và chỉ định tên chuỗi kết nối có tác dụng tmê man số. Xin xem xét rằng tên chuỗi liên kết nên ban đầu bởi "name =", còn nếu không, nó sẽ coi nó là tên cơ sở tài liệu.

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

Đảm bảo rằng bạn tất cả trực thuộc tính providerName="System.Data.SqlClient" mang lại đại lý dữ liệu Squốc lộ Server vào chuỗi kết nối.

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

Quý Khách đang tạo thành đại lý dữ liệu sau thời điểm chạy ứng dụng Code First lần thứ nhất, dẫu vậy lần vật dụng hai trsinh hoạt đi thì sao? Nó sẽ khởi tạo ra một các đại lý tài liệu bắt đầu từng khi bạn chạy ứng dụng?

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

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

Có tứ chiến lược khởi sinh sản đại lý dữ liệu không giống nhau trong Code First:

CreateDatabaseIfNotExists: Đây là trình khởi chế tạo ra khoác định. Như tên gọi, nó sẽ khởi tạo cơ sở tài liệu còn nếu như không mãi mãi theo cấu hình. Tuy nhiên, nếu bạn biến hóa lớp quy mô cùng tiếp nối chạy ứng dụng với trình khởi chế tạo này, thì nó vẫn đưa ra một nước ngoài lệ.DropCreateDatabaseIfModelChanges: Trình khởi chế tác này xóa cửa hàng tài liệu hiện tại có và chế tạo đại lý tài liệu new, ví như các lớp quy mô của chúng ta (các lớp thực thể) đã bị thay đổi. Vì vậy, chúng ta chưa phải lo ngại về bài toán gia hạn lược đồ đại lý dữ liệu của mình, Lúc các lớp mô hình của người tiêu dùng biến đổi.DropCreateDatabaseAlways: Nlỗi thương hiệu cho thấy thêm, trình khởi sản xuất này đang xóa đại lý dữ liệu hiện có mỗi khi bạn chạy ứng dụng, bất cứ những lớp mô hình của bạn có biến đổi hay là không. Vấn đề này đã hữu dụng lúc bạn muốn gồm một cửa hàng dữ liệu bắt đầu mỗi khi bạn chạy áp dụng, ví dụ như khi chúng ta sẽ trở nên tân tiến áp dụng.Trình khởi tạo ra các đại lý tài liệu tùy chỉnh: Quý khách hàng cũng có thể tạo thành trình khởi chế tác cấu hình thiết lập của riêng bản thân, giả dụ các bí quyết trên không đáp ứng đề nghị của người sử dụng hoặc bạn muốn thực hiện một vài tiến trình khác để khởi tạo đại lý tài liệu bởi trình khởi chế tác sống 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 kế hoạch khởi chế tạo đại lý tài liệu trong EF.
Trung Nguyenviviancosmetics.vn
*

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

Quý Khách có thể kiến thiết những lớp thực thể của chính bản thân mình bằng cách áp dụng tính kế thừa trong C#.

Trong lập trình sẵn phía đối tượng người sử dụng, những lớp gồm quan hệ "has a" cùng "is a", trong những khi kia quy mô dục tình dựa vào Squốc lộ chỉ tất cả mối quan hệ "has a" giữa những bảng.

Hệ quản trị đại lý dữ liệu SQL không cung cấp mối quan hệ "is a". Vì vậy, làm cho nạm làm sao bạn có thể ánh xạ các lớp thực thể bao gồm mối quan hệ "is a" vào các đại lý tài liệu quan tiền hệ?

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

Table per Hierarchy (TPH): Cách tiếp cận này ý kiến đề nghị tạo thành một bảng tầm thường mang lại toàn cục những lớp trong phân cung cấp kế thừa. Bảng này còn có một cột để khác nhau thân những lớp con. Đây là 1 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 đề xuất tạo mỗi bảng cho từng lớp trong phân cung cấp thừa kế (tạo bảng cho cả lớp cha với lớp con).Table per Concrete Class (TPC): Cách tiếp cận này kiến nghị chế tạo ra từng bảng cho từng lớp bé vào phân cấp kế thừa, tuy nhiên không tạo thành bảng mang lại lớp phụ vương. Vì vậy những ở trong tính của lớp phụ thân đang là một phần của mỗi bảng của lớp con.

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


Trung Nguyenviviancosmetics.vn
*

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

Code First chế tạo mô hình khái niệm trường đoản cú những lớp thực thể của khách hàng bằng cách thực hiện những quy ước mang định.

EF 6 Code First tận dụng một mẫu mã lập trình sẵn được điện thoại tư vấn là quy ước về thông số kỹ thuật. Tuy nhiên, bạn có thể ghi đtrằn các quy ước này bằng cách cấu hình các lớp thực thể của bạn để hỗ trợ đến EF công bố cần thiết.

Có nhì cách để cấu hình 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 những thông số kỹ thuật dựa vào attribute dễ dàng, chúng ta cũng có thể áp dụng cho những lớp với thuộc tính của chính nó.

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

lấy một ví dụ tiếp sau đây minch họa bài toán áp dụng một trong những attribute ghi chú dữ liệu:

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


Trung Nguyenviviancosmetics.vn

Fluent API

Một bí quyết không giống nhằm định cấu hình các 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 (tốt nói một cách khác là bối cảnh thông thạo) trong đó tác dụng được sản xuất thành xuất phát điểm từ 1 chuỗi cách làm.

Cấu hình Fluent API hoàn toàn có thể được vận dụng Lúc EF desgin quy mô từ bỏ các lớp thực thể của khách hàng. Quý khách hàng rất có thể thêm các thông số kỹ thuật Fluent API bằng cách ghi đè cổ cách tiến hành OnModelCreating của lớp DbContext vào Entity Framework 6.x, nhỏng đượ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 hàng hoàn toàn có thể sử dụng tmê say số modelBuilder, một đối tượng người tiêu dùng của lớp DbModelBuilder để thông số kỹ thuật những lớp thực thể của chúng ta. DbModelBuilder được Call là Fluent API vày bạn có thể điện thoại tư vấn những thủ tục không giống nhau vào một chuỗi thủ tục.

Tìm phát âm cụ thể về Fluent API vào Entity Framework trên nội dung bài viết này:


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

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

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

Có bố nhiều loại mối quan hệ giữa những bảng cùng bọn chúng khác biệt tùy nằm trong vào phương pháp có mang các cột tương quan.

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

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


Migration trong Code First

Entity Framework Code First tất cả các chiến lược khởi chế tạo cửa hàng tài liệu khác biệt nhỏng CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges, với DropCreateDatabaseAlways.

Tuy nhiên, có một số trong những sự việc cùng với các kế hoạch này, ví dụ: giả dụ bạn đã sở hữu tài liệu (trừ seed data - dữ liệu ban sơ đạt thêm bằng code) hoặc stored procedures, triggers, v.v. trong đại lý dữ liệu của chúng ta.

Các kế hoạch này được thực hiện nhằm loại trừ cục bộ đại lý tài liệu cùng chế tạo ra lại nó, vì thế bạn sẽ mất tài liệu và các đối tượng DB không giống.

Entity Framework đang giới thiệu một mức sử dụng migration tự động hóa cập nhật lược thứ đại lý tài liệu Khi mô hình của người tiêu dùng biến hóa cơ mà không mất ngẫu nhiên dữ liệu hiện tại gồm hoặc những đối tượng người tiêu dùng cửa hàng dữ liệu khác. Nó thực hiện một trình khởi chế tạo đại lý dữ liệu mới Gọi là MigrateDatabaseToLatestVersion.

Xem thêm: Download Getting Over It With Bennett Foddy 1, Getting Over It With Bennett Foddy Online

Có nhì nhiều loại Migration:

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

Để làm rõ về nhị nhiều loại Migration vào Code First chúng ta có thể tham khảo bài viết sau:


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

Tại phần này, các bạn sẽ tò mò giải pháp sản xuất Context cùng những lớp thực thể từ bỏ cơ sở dữ liệu tất cả sẵn, sử dụng phương pháp tiếp cận Code First.

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

Để áp dụng Code First mang lại cơ sở dữ liệu tất cả sẵn, bấm vào nên 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 cùng khắc tên cho quy mô (phía trên sẽ là tên lớp Context) rồi nhấp vào nút Add.

*

Điều này vẫn msinh hoạt trình giải đáp Entity Data Model nhỏng tiếp sau đây. Chọn Code First from database và thừa nhận Next.

*

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

*

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

*

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

*

Nó cũng trở thành chế tác lớp Context sau áp dụng Fluent API nhằm cấu hình các lớp thực thể theo đại lý dữ liệu của khách hà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 đã auto xóa những phiên bản ghi phụ thuộc vào hoặc thiết lập những cột khóa ngoại thành null lúc bản ghi phụ thân bị xóa vào đại lý dữ liệu.

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

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 bao gồm quan hệ một-một.

public class Student public int StudentId get; set; public string StudentName get; set; public virtual StudentAddress Address get; set; public class StudentAddress public int StudentAddressId get; set; public string Address1 get; set; public string Address2 get; set; public string City get; set; public int Zipcode get; set; public string State get; set; public string Country get; set; public virtual Student Student get; set; Ví dụ dưới đâ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, đầu tiên EF lưu giữ đối tượng người sử dụng stud của thực thể Student và đối tượng add của thực thể StudentAddress của nó vào đại lý dữ liệu.

Sau kia, Khi xóa đối tượng stud với điện thoại tư vấn cách thức SaveChanges(), EF đã xóa stud cũng tương tự bản ghi tương ứng của chính nó vào bảng StudentAddresses.

Do kia, EF cho phép cascade delete theo khoác định.

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

Hãy coi ví dụ sau đây: các thực thể Student cùng Standard bao gồm mối 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 một ví dụ dưới đây minc họa cascade delete thân những thực thể 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 và standard1 into db ctx.SaveChanges(); //deletes standard1 from db and 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ửa hàng tài liệu và nó cũng tùy chỉnh cột khóa nước ngoài standard_StandardId trong bảng Students thành null đến toàn bộ các bạn dạng ghi tđam mê chiếu đối tượng người sử dụng standard1.

Lưu ý: EF tự động xóa các phiên bản ghi liên quan vào bảng trọng điểm cho những thực thể tất 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 cho toàn bộ những thực thể.

Tắt Cascade Delete

Sử dụng Fluent API nhằm cấu hình tắt cascade delete cho các thực thể để bằng thủ tục WillCascadeOnDelete(), nhỏng ví dụ bên dưới.

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

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

Entity Framework 6 Code First hỗ trợ năng lực tạo và sử dụng stored procedure nhằm triển khai các thao tác làm việc thêm, update và xóa lúc call thủ tục SaveChanges().

Chúng ta hãy sử dụng những stored procedure cho các thao tác CUD (Create, Update, Delete) đến thực thể Student sau.

class Student public int StudentId get; set; public string StudentName get; set; public DateTime DoB get; set; Sử dụng cách thức MapToStoredProcedures() nhằm ánh xạ một thực thể cùng với các stored procedure khoác định (những stored procedure mang định này sẽ tiến hành tạo bởi EF API). lấy ví dụ 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 cha stored procedure Student_Insert, Student_Update với Student_Delete đến thực thể Student sống bên trên, nhỏng hình tiếp sau đây.

*

Các stored procedure Student_Insert cùng Student_Update bao gồm những tsi mê số mang đến tất cả các nằm trong tính của thực thể Student. Riêng stored procedure Student_Delete chỉ có một tsay đắm số mang lại trực thuộc tính khóa chủ yếu StudentId của thực thể Student. Sau đó là mã của những stored procedure.

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

Ánh xạ Stored procedure tùy chỉnh cấu hình cho một thực thể

EF 6 được cho phép bạn thực hiện các stored procedure tùy chỉnh cấu hình của riêng biệt các bạn và ánh xạ bọn chúng tới một thực thể. Bạn cũng hoàn toàn có thể cấu hình ánh xạ tmê mệt số cùng với những thuộc tính của thực thể.

lấy một ví dụ sau ánh xạ những stored procedure thiết lập cấu hình với thực thể Student.

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

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

Quý khách hàng hoàn toàn có thể ánh xạ toàn bộ những thực thể của mình cùng với những stored procedure mặc định vào một câu lệnh nhỏng tiếp sau đây.

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

Hạn chế

Chỉ có thể áp dụng Fluent API để ánh xạ các stored procedure. Không có attribute chú thích dữ liệu như thế nào có sẵn trong EF 6 để ánh xạ stored procedure.Quý Khách yêu cầu ánh xạ các stored procedure thêm, cập nhật và xóa cho một thực thể ví như bạn có nhu cầu thực hiện stored procedure cho các vận động CUD. Ánh xạ duy nhất trong số các thao tác làm việc CUD là không được phép.

Chuyển thông số kỹ thuật Fluent API quý phái một tờ riêng trong Code First

Nlỗi các bạn vẫn thấy trong các lý giải trước, công ty chúng tôi đã cấu hình tất cả những lớp thực thể bởi Fluent API trong phương thức OnModelCreating().

Tuy nhiên, nó trnghỉ ngơi buộc phải nặng nề gia hạn nếu khách hàng thông số kỹ thuật một trong những lượng béo những lớp thực thể trong OnModelCreating.

EF 6 cho phép chúng ta tạo thành một tấm riêng biệt đến từng thực thể với đặt tất cả những 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 tiếng, chúng ta có thể dịch chuyển toàn bộ những thông số kỹ thuật tương quan mang lại thực thể Student sang trọng một lớp riêng rẽ gồm nguồn gốc từ bỏ EntityTypeConfiguration.

Hãy coi lớp StudentEntityConfigurations sau bao hàm toàn bộ những thông số kỹ thuật 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ũng có thể thấy làm việc bên trên, chúng tôi đã gửi tất cả các cấu hình cho thực thể Student vào cách làm khởi sản xuất của lớp StudentEntityConfiguration, gồm bắt đầu tự EntityTypeConfiguration.

Bây giờ đồng hồ, bạn cần thêm lớp thông số kỹ thuật tùy chỉnh cấu hình này áp 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 các lớp cấu hình để tăng tài năng đọc cùng bảo trì.

Seed Data vào Code-First

quý khách hàng có thể ckém tài liệu vào các bảng đại lý tài liệu của bản thân mình trong quá trình khởi tạo nên các đại lý tài liệu. Điều này sẽ khá đặc trưng giả dụ bạn muốn cung ứng một vài tài liệu xem sét mang đến vận dụng của chúng ta hoặc một trong những tài liệu bao gồm mặc định mang lại áp dụng của khách hàng.

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

lấy một ví dụ dưới đây cho biết thêm cách bạn có thể cung ứng tài liệu mang định đến bảng Standard trong khi khởi chế tạo ra cơ sở 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, tùy chỉnh lớp khởi sản xuất 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 các quy ước thiết lập vào Code First

Quý Khách đang tò mò về những quy ước vào Code First vào phần đầu của bài viết. EF 6 cũng hỗ trợ kỹ năng có mang những quy ước tùy chỉnh cấu hình của riêng rẽ bạn.

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

Quy ước cấu hình

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

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

Ví dụ: bạn có nhu cầu thông số kỹ thuật một trực thuộc tính làm cho thuộc tính khóa có tên khớp cùng với tên thực thể_ID, ví dụ: thuộc tính Student_ID của thực thể Student sẽ là khóa chủ yếu. Sau trên đây có mang 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, chúng ta cũng có thể có mang quy ước đến kích thước của đẳng cấp dữ liệu.

lấy ví dụ như tiếp sau đây khái niệm một quy ước cho những thuộc tính chuỗi. Nó sẽ tạo những cột nvarchar bao gồm size 50 trong SQL Server mang lại tất cả những ở 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 rất có thể định nghĩa một lớp thiết lập mang lại quy ước này bằng cách 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 tạo thành lớp quy ước thiết lập, hãy thêm nó vào những quy ước như dưới đây:

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

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

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

Xem thêm: Cách Chơi Minecraft Ko Lag, Làm Thế Nào Để Chơi Minecraft Không Bị Lag

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