Code first mvc hướng dẫn

Code First là gì?

Entity Framework đã reviews cách tiếp cận Code First trong Entity Framework 4.1. Code First chủ yếu có ích vào Thiết kế hướng domain name.

Bạn đang xem: Code first mvc hướng dẫn

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

*

Như bạn có thể thấy trong hình bên trên, Entity Framework API sẽ tạo nên các đại lý dữ liệu dựa vào cấu hình với các lớp miền của doanh nghiệp. Điều này có nghĩa là bạn cần bắt đầu viết code trước bằng C# hoặc VB.NET và sau đó Entity Framework (EF) sẽ tạo các đại lý tài liệu tự code của chúng ta.

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

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

*

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

Các quy ước trong Code First

Các quy ước là các cỗ phép tắc mặc định auto thông số kỹ thuật một mô hình quan niệm dựa vào các lớp miền của doanh nghiệp Lúc thao tác với bí quyết tiếp cận Code First.

Nlỗi các bạn đã thấy vào ví dụ làm việc bên trên, Entity Framework API đang cấu hình các khóa thiết yếu, khóa ngoại, các quan hệ, loại dữ liệu của cột, v.v. trường đoản cú các lớp miền nhưng không bắt buộc cấu hình bổ sung cập nhật.

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

Các quy ước trong Entity Framework 6.x Code First được có mang trong namespace System.Data.Entity.ModelConfiguration.Conventions .

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


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

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


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

Hình tiếp sau đây minc họa ánh xạ quy ước cùng với đại lý tài liệu.

*

Quy ước về mối quan hệ

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

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

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

Code First chế tạo dạng hình phức tạp mang lại lớp không bao gồm ở trong tính khóa và khóa bao gồm không được đăng ký bằng trực thuộc tính DataAnnotation hoặc Fluent API.

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

Khởi tạo thành các đại lý dữ liệu trong Code First

Ở phần này, chúng ta đang khám phá bí quyết Entity Framework ra quyết định tên các đại lý dữ liệu cùng máy chủ trong lúc khởi tạo cơ sở tài liệu theo cách tiếp cận Code First.

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

*

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

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

Không gồm tsay mê số.Tên đại lý tài liệu.Tên chuỗi kết nối.

Không có tsi mê số

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

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

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

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

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

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

Hãy cẩn thận ví dụ sau khu vực bọn họ truyền tđam mê số name=SchoolDBConnectionString trong phương thức khởi tạo thành cửa hàng.

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

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

Tên các đại lý dữ liệu trong 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 thực hiện cửa hàng tài liệu SchoolDB hiện tại có vào Squốc lộ Server toàn cục.

Đảm nói rằng chúng ta tất cả thuộc tính providerName="System.Data.SqlClient" mang lại cửa hàng dữ liệu SQL Server trong chuỗi liên kết.

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

Quý khách hàng đang chế tạo cơ sở dữ liệu sau khoản thời gian chạy ứng dụng Code First lần thứ nhất, nhưng mà lần máy hai trngơi nghỉ đi thì sao? Nó sẽ khởi tạo ra một các đại lý tài liệu new từng khi chúng ta chạy ứng dụng?

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

Để cách xử trí những kịch bạn dạng này, bạn nên thực hiện một trong số chiến lược khởi sinh sản đại lý dữ liệu.

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

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

Bạn 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 hướng đối tượng người sử dụng, các lớp gồm mối quan hệ "has a" với "is a", trong lúc đó mô hình dục tình dựa trên Squốc lộ chỉ bao gồm mối quan hệ "has a" thân các bảng.

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

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

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

Xem chi tiết ba giải pháp tiếp cạn nhằm anh xạ kế thừa vào các đại lý dữ liệu vào Code First:


Trung Nguyenearlsdaughter.com
*

Cấu hình các phần trong Entity Framework

Code First xuất bản quy mô định nghĩa từ các lớp thực thể của bạn bằng phương pháp sử dụng các quy ước khoác định.

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

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

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

Attribute chú thích dữ liệu

Crúc ưa thích dữ liệu là một cấu hình dựa vào attribute đơn giản dễ dàng, bạn có thể vận dụng cho các lớp cùng trực thuộc tính của chính nó.

Các attribute này không chỉ giành cho EF mà còn được áp dụng vào ASP..NET Web Form và ASP.NET MVC. Do kia, bọn chúng được đặt trong một namespace cá biệt là System.ComponentModel.DataAnnotations.

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


Trung Nguyenearlsdaughter.com

Fluent API

Một cách không giống để định cấu hình những lớp là bằng cách thực hiện Entity Framework Fluent API. Fluent API dựa trên chủng loại kiến tạo Fluent API (tuyệt còn gọi là đồ họa thông thạo) trong các số đó kết quả được sinh sản thành từ 1 chuỗi cách tiến hành.

Cấu hình Fluent API có thể được áp dụng Lúc EF sản xuất mô hình từ bỏ các lớp thực thể của người sử dụng. quý khách rất có thể thêm các thông số kỹ thuật Fluent API bằng phương pháp ghi đè cổ cách thức OnModelCreating của lớp DbContext trong 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 tên miền classes using modelBuilder here.. Quý Khách rất có thể sử dụng tmê say số modelBuilder, một đối tượng người sử 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 điện thoại tư vấn là Fluent API vày chúng ta cũng có thể điện thoại tư vấn những cách tiến hành khác biệt trong một chuỗi phương thức.

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


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

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

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

Có cha nhiều loại mối quan hệ thân những bảng cùng bọn chúng khác nhau tùy thuộc vào giải pháp tư tưởng những cột liên quan.

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

Để nắm rõ cách thông số kỹ thuật các mối quan hệ thân những thực thể trong Entity Framwork Code First bạn 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 sinh sản các đại lý dữ liệu khác biệt nlỗi CreateDatabaseIfNotExists, DropCreateDatabaseIfModelChanges, với DropCreateDatabaseAlways.

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

Các chiến lược này được thực hiện nhằm loại trừ toàn cục cửa hàng tài liệu cùng chế tạo ra lại nó, cho nên vì vậy bạn sẽ mất tài liệu với các đối tượng người sử dụng DB không giống.

Entity Framework sẽ giới thiệu một khí cụ migration tự động hóa update lược đồ các đại lý tài liệu Khi mô hình của chúng ta chuyển đổi mà ko mất ngẫu nhiên dữ liệu hiện nay bao gồm hoặc các đối tượng người sử dụng các đại lý tài liệu không giống. Nó sử dụng một trình khởi tạo thành cơ sở dữ liệu mới Gọi là MigrateDatabaseToLatestVersion.

Xem thêm: Hướng Dẫn Trồng Đậu Rồng Đậu Rồng Đơn Giản Trong Thùng Xốp Cho Quả Sai Trĩu

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

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

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


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

Ở phần này, các bạn sẽ khám phá giải pháp sản xuất Context với các lớp thực thể tự các đại lý tài liệu có sẵn, áp dụng phương thức tiếp cận Code First.

Entity Framework cung cấp một bí quyết dễ dàng nhằm sử dụng Code First mang lại cơ sở dữ liệu gồm sẵn. Nó sẽ tạo nên các lớp thực thể đến tất cả những bảng với view vào cửa hàng tài liệu bây giờ của người tiêu dùng và cấu hình bọn chúng cùng với các attribute chú giải dữ liệu cùng Fluent API.

Để sử dụng Code First mang đến đại lý dữ liệu có sẵn, nhấn vào đề xuất vào dự án của doanh nghiệp trong Visual Studio -> Add -> New Item..

*

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

*

Như vậy sẽ msinh sống trình lý giải Entity Data Model nlỗi sau đây. Chọn Code First from database với thừa nhận Next.

*

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

*

Bây giờ đồng hồ, chọn những bảng với view nhưng bạn có nhu cầu chế tạo những lớp thực thể và nhấp vào Finish.

*

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

*

Nó cũng biến thành tạo lớp Context sau sử dụng Fluent API nhằm thông số kỹ thuật các lớp thực thể theo cơ sở dữ liệu của doanh nghiệp.

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 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 phố null khi bản ghi phụ thân bị xóa trong đại lý tài liệu.

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

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

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

Sau kia, Khi xóa đối tượng người dùng stud cùng call thủ tục SaveChanges(), EF đang xóa stud tương tự như phiên bản ghi tương xứng của nó trong bảng StudentAddresses.

Do đó, EF có thể chấp nhận được cascade delete theo mang đị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 và 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 ví dụ tiếp sau đây minch họa cascade delete giữa những thực thể có 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 lớn db ctx.SaveChanges(); //deletes standard1 from db & 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 dùng standard1 ngoài cơ sở dữ liệu với nó cũng thiết lập cột khóa nước ngoài standard_StandardId trong bảng Students thành null mang đến tất cả các bản ghi ttê mê chiếu đối tượng standard1.

Lưu ý: EF auto xóa các phiên bản ghi liên quan vào bảng trung tâm cho các thực thể bao gồm quan hệ nhiều-các nếu một thực thể bị xóa.

Do đó, EF cho phép cascade delete mang định cho toàn bộ các thực thể.

Tắt Cascade Delete

Sử dụng Fluent API nhằm thông số kỹ thuật tắt cascade delete cho những thực thể nhằm bằng cách tiến hành WillCascadeOnDelete(), như ví dụ 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 nào gồm sẵn để tắt cascade delete.

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

Entity Framework 6 Code First hỗ trợ tài năng sinh sản với áp dụng stored procedure nhằm triển khai những làm việc thêm, cập nhật và xóa lúc call thủ tục SaveChanges().

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

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

*

Các stored procedure Student_Insert và Student_Update gồm các ttê mê số mang lại toàn bộ những nằm trong tính của thực thể Student. Riêng stored procedure Student_Delete chỉ tất cả một tsi số cho trực thuộc tính khóa bao gồm 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 cấu hình thiết lập cho một thực thể

EF 6 chất nhận được bạn sử dụng các stored procedure thiết lập của riêng rẽ các bạn với ánh xạ bọn chúng cho tới một thực thể. quý khách cũng rất có thể thông số kỹ thuật ánh xạ tham mê số cùng với các ở trong 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ạ cho tới những stored procedure sp_InsertStudent, sp_UpdateStudent với sp_DeleteStudent. Nó cũng thông số kỹ thuật ánh xạ thân các tyêu thích số với thuộc tính của thực thể.

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

quý khách hàng có thể ánh xạ tất cả những thực thể của mình với các stored procedure khoác định trong 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ỉ rất có thể sử dụng Fluent API nhằm ánh xạ những stored procedure. Không tất 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 nên ánh xạ các stored procedure thêm, update cùng xóa cho 1 thực thể giả dụ bạn có nhu cầu thực hiện stored procedure cho các chuyển động CUD. Ánh xạ duy nhất trong các những thao tác CUD là không được phnghiền.

Chuyển cấu hình Fluent API thanh lịch một lớp riêng rẽ trong Code First

Như bạn sẽ thấy trong số hướng dẫn trước, công ty chúng tôi đã thông số kỹ thuật tất cả những lớp thực thể bởi Fluent API vào phương thức OnModelCreating().

Tuy nhiên, nó trlàm việc đề nghị khó khăn bảo trì nếu khách hàng cấu hình một trong những lượng béo những lớp thực thể vào OnModelCreating.

EF 6 cho phép chúng ta sản xuất một tấm riêng biệt mang đến từng thực thể với đặt toàn bộ các thông số kỹ thuật liên quan cho thực thể trong lớp kia.

Hãy xem ví dụ sau vị trí họ thông số kỹ thuật thực thể Student.

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

Hãy xem lớp StudentEntityConfigurations sau bao gồm toàn bộ các thông số kỹ thuật mang lại 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 sinh hoạt bên trên, chúng tôi đang gửi tất cả những thông số kỹ thuật cho thực thể Student vào cách tiến hành khởi chế tác của lớp StudentEntityConfiguration, có xuất phát trường đoản cú EntityTypeConfiguration.

Bây giờ đồng hồ, bạn cần thêm lớp cấu hình 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 đó, chúng ta cũng có thể sử dụng các lớp thông số kỹ thuật nhằm tăng kĩ năng hiểu cùng gia hạn.

Seed Data trong Code-First

quý khách có thể cyếu tài liệu vào những bảng cơ sở tài liệu của chính mình trong quy trình khởi tạo ra cửa hàng dữ liệu. Vấn đề này sẽ khá quan trọng ví như bạn muốn cung cấp một số dữ liệu phân tách mang đến vận dụng của công ty hoặc một vài tài liệu bao gồm mang định mang lại ứng dụng của bạn.

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

lấy ví dụ như sau đây cho thấy thêm cách bạn cũng có thể cung cấp tài liệu mặc định cho bảng Standard trong những khi khởi tạo đạ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, tùy chỉnh lớp khởi sinh sản DB này trong lớp Context như 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 trong Code First

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

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

Quy ước cấu hình

Quy ước cấu hình là một phương pháp để cấu hình các thực thể mà lại ko ghi đè cấu hình mặc định được hỗ trợ trong Fluent API.

quý khách có thể khái niệm một quy ước thông số kỹ thuật trong phương thức OnModelCreating() với cả vào lớp tùy chỉnh thiết lập, giống như nhỏng phương pháp bạn sẽ có mang ánh xạ thực thể thông thường với Fluent API.

Ví dụ: bạn có nhu cầu cấu hình một ở trong tính có tác dụng thuộc tính khóa có tên khớp cùng với tên thực thể_ID, ví dụ: trực thuộc tính Student_ID của thực thể Student sẽ là khóa chính. Sau phía trên quan niệm quy ước này.

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)modelBuilder.Properties().Where(p => p.PropertyType.Name == "String").Configure(p => p.HasMaxLength(50)); base.OnModelCreating(modelBuilder);Quý Khách cũng có thể quan niệm một tờ tùy chỉnh mang lại quy ước này bằng cách kế thừa lớp Convention, nlỗi 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 thiết lập cấu hình, hãy thêm nó vào những quy ước như bên dưới đây:

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

Quy ước mô hình

Quy ước quy mô dựa vào khôn xiết dữ liệu quy mô cơ phiên bản. Có các quy ước cho cả DataBase với SSDL.

Tạo một lớp triển khai interface IConceptualModelConvention trường đoản cú các quy ước CSDL cùng IStoreModelConvention trường đoản cú các quy ước SSDL.