Mã khung thực thể Đầu tiên - Ưu điểm và nhược điểm của Thông thạo Api và Chú thích dữ liệu [đã đóng]


118

Khi tạo cơ sở dữ liệu bằng cách sử dụng mã Entity Framework trước tiên, rất nhiều mô hình cơ sở dữ liệu có thể được trích xuất từ ​​mã. API thông thạo và / hoặc các thuộc tính có thể được sử dụng để tinh chỉnh mô hình.

Những ưu điểm và nhược điểm của Fluent Api so với Chú thích dữ liệu là gì? Nói cách khác: Ngay cả trong một số trường hợp, cả hai phương pháp đều có thể được sử dụng, trong trường hợp nào thì một phương thức nên chiếm ưu thế hơn phương pháp kia?


3
Chỉ là một ý tưởng: Những gì tôi thường làm là tạo một dự án Mô hình với các POCO của tôi, và sau đó trong dự án Kho lưu trữ, tạo một bộ POCO mới dành riêng cho EF và đặt các chú thích của tôi ở đó. Sau đó, tôi chỉ ánh xạ giữa hai trong các lớp mapper. Bằng cách đó, mô hình của tôi không bị ảnh hưởng và giúp dễ dàng thêm vào / thay đổi chiến lược dữ liệu của tôi, nếu cần (ví dụ: thêm XmlRep repository và sử dụng cùng các lớp Model).
adimauro

1
Bây giờ tôi thích Chú thích, với EFCore và các thư viện bổ sung. (yêu cầu mã ít hơn, và tất cả là ở một nơi) github.com/isukces/EfCore.Shaman - add và mở rộng thuộc tính github.com/borisdj/EFCore.FluentApiToAnnotation - hữu ích khi DB đã tồn tại, sau khi làm Xếp-Kỹ thuật và chuyển sang CodeFirst
boronomj

Câu trả lời:


140

Mọi thứ bạn có thể định cấu hình với DataAnnotations cũng có thể với API Fluent. Điều ngược lại là không đúng sự thật. Vì vậy, từ quan điểm của các tùy chọn cấu hình và tính linh hoạt, Fluent API là "tốt hơn".

Các ví dụ về cấu hình (chắc chắn không phải là danh sách đầy đủ) có thể có trong Fluent API nhưng không phải với DataAnnotations (theo như tôi có thể thấy):

  • Tắt xóa tầng:

    .WillCascadeOnDelete(false)

  • Chỉ định tên cột khóa ngoài trong cơ sở dữ liệu khi khóa không được hiển thị trong mô hình đối tượng của bạn:

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • Điều chỉnh chi tiết các mối quan hệ, đặc biệt là trong mọi trường hợp chỉ có một mặt của liên kết được hiển thị trong mô hình đối tượng:

    .WithMany(...), WithOptional(...), WithRequiredDependent(...),WithRequiredPrincipal(...)

  • Đặc tả ánh xạ kế thừa giữa mô hình đối tượng và các bảng cơ sở dữ liệu (Bảng-Per-HVELy, Table-Per-Type, Table-Per-Concrete-Class):

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

Chỉnh sửa: Microsoft coi API Fluent là "tính năng nâng cao" (Trích dẫn từ đây ):

API thông thạo được coi là một tính năng nâng cao hơn và chúng tôi khuyên bạn nên sử dụng Chú thích dữ liệu trừ khi các yêu cầu của bạn yêu cầu bạn sử dụng API thông thạo.

Nhưng theo tôi, bạn đạt đến giới hạn của DataAnnotations rất nhanh (ngoại trừ các mô hình đối tượng cực kỳ đơn giản). Nếu bạn không thể tinh chỉnh mô hình của mình bằng DataAnnotations nữa, biện pháp cuối cùng của bạn là tuân theo các quy ước ánh xạ mặc định (bằng cách đặt tên các thuộc tính của bạn theo các quy tắc đó). Hiện tại bạn không thể ghi đè lên các quy ước (chỉ vô hiệu hóa chúng; MS đã thông báo cung cấp tùy chọn cấu hình cho các quy ước trong các bản phát hành EF trong tương lai). Nhưng nếu bạn không muốn bị ép buộc bởi các quy ước ánh xạ khi bạn xác định mô hình đối tượng của mình, thì tùy chọn duy nhất của bạn là API Fluent.

Học API thông thạo gần như là một điều bắt buộc, DataAnnotations là một ứng dụng hay cho các ứng dụng đơn giản.


2
Tôi là một người mới trong lĩnh vực này. API Fluent có thể được sử dụng để xác thực giao diện người dùng như DataAnnotation có thể làm được không?
hôn vào nách của tôi

26
@CountTerrorist: Tôi không nghĩ vậy. Ví dụ: Nếu bạn đặt [Required]thuộc tính trên một thuộc tính trong ứng dụng ASP.NET MVC, nó sẽ được sử dụng bởi cả EF MVC cho mục đích xác thực vì cả hai đều có thể xử lý thuộc tính này. Nhưng MVC sẽ không hiểu cấu hình Fluent API. Vì vậy, nếu bạn loại bỏ thuộc tính và sử dụng HasRequiredtrong Fluent API thay vào đó, đối với EF, nó sẽ giống nhau nhưng không phải với MVC. (Theo tôi, các thuộc tính nên được đặt tên khác nhau, việc sử dụng không gian tên DataAnnotations từ các thành phần khác nhau và cho các mục đích khác nhau là rất khó hiểu.)
Slauma

3
Cũng lưu ý [DefaultValue()]là không thể trong Fluent Either.
webnoob

3
MinValue là một thuộc tính không thể được xác định thông qua API Fluent (Khung thực thể lập trình: Mã đầu tiên) (nguồn: đã xóa NAA bởi The Cog )
Serge Ballesta

7
Từ quan điểm kiến ​​trúc, tôi đoán Fluent APIsẽ giữ logic thực hiện của bạn trong bạn DbContextvà giữ cho bạn POCOsạch sẽ
Luke T O'Brien
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.