Là giao diện lưu loát linh hoạt hơn các thuộc tính và tại sao?


15

Trong mã EF 4.1 Hướng dẫn đầu tiên, đoạn mã sau được đưa ra:

public class Department
{
    public int DepartmentId { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Collaborator> Collaborators { get; set; }
}

Sau đó, nó được giải thích rằng giao diện trôi chảy linh hoạt hơn:

Chú thích dữ liệu chắc chắn dễ sử dụng nhưng tốt hơn là sử dụng phương pháp lập trình cung cấp sự linh hoạt hơn nhiều.

Ví dụ về việc sử dụng giao diện trôi chảy được đưa ra:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Department>().Property(dp => dp.Name).IsRequired();
    modelBuilder.Entity<Manager>().HasKey(ma => ma.ManagerCode);
    modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .IsConcurrencyToken(true)
        .IsVariableLength()
        .HasMaxLength(20);
}

Tôi không thể hiểu tại sao giao diện trôi chảy được cho là tốt hơn. Có thật không? Từ quan điểm của tôi, có vẻ như các chú thích dữ liệu rõ ràng hơn và có nhiều cảm giác ngữ nghĩa rõ ràng với nó.

Câu hỏi của tôi là tại sao một giao diện trôi chảy sẽ là một lựa chọn tốt hơn so với việc sử dụng các thuộc tính, đặc biệt là trong trường hợp này?

(Lưu ý: Tôi còn khá mới đối với toàn bộ khái niệm về giao diện lưu loát, vì vậy vui lòng mong đợi không có kiến ​​thức trước về điều này.)

Tham khảo: http://codefirst.codeplex.com/


Câu hỏi này không thực sự về giao diện trôi chảy. Sự khác biệt là giữa việc sử dụng các thuộc tính và mã thông thường. Nếu mã không trôi chảy, nó sẽ không thay đổi nhiều về câu hỏi của bạn.
Svick

Các giao diện lưu loát @svick về cơ bản là mã thông thường, nhưng nó thể hiện nó theo một cách khác. Chúng tôi đã chuyển từ việc chỉ định những thứ trong mã đơn giản sang các thuộc tính, bây giờ với các giao diện trôi chảy, có vẻ như một số đang quay lại và chuyển sang chỉ định lại những thứ trong mã. Tôi chỉ muốn hiểu tại sao bạn sẽ sử dụng mã thay vì thuộc tính. Các giao diện lưu loát có đảm bảo di chuyển khỏi các thuộc tính và quay lại đơn giản hóa mọi thứ một lần nữa không?
Tjaart

Câu trả lời:


13

Chú thích dữ liệu là tĩnh, ví dụ khai báo phương thức này không thể thay đổi khi chạy:

  [MinLength(5)]
  [MaxLength(20,ErrorMessage="Le nom ne peut pas avoir plus de 20 caractères")]
  public new string Name { get; set; }

Giao diện lưu loát có thể là động:

   if (longNamesEnabled)
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(100);
   }
   else
   {
      modelBuilder.Entity<Manager>().Property(ma => ma.Name)
        .HasMaxLength(20);
   }

không đề cập đến mã có thể được sử dụng lại giữa các thuộc tính.


2
tại sao bạn nghĩ rằng chiều dài (hoặc bất kỳ tài sản nào khác) của cùng một tài sản sẽ thay đổi trong thời gian chạy?
Yusubov

1
@ElYusubov: Tôi sẽ bắt đầu với các tình huống mà tôi không biết độ dài trường tại thời điểm mã hóa.
Wyatt Barnett

@WyattBarnett: có thể có ý nghĩa là có độ dài trường chỉ là một biến khi các tham số miền được tìm nạp động từ một số dịch vụ hoặc nguồn không được gõ bên ngoài. Tuy nhiên, xử lý linh hoạt với các thuộc tính miền sẽ yêu cầu phương pháp mã hóa phòng thủ.
Yusubov

1
@ElYusubov bạn có thể có hai thuộc tính cần giống hệt nhau ngoại trừ độ dài để tôi chuyển chúng vào một hàm thiết lập chúng một cách linh hoạt. Đây là lý do tại sao tác giả gọi chúng linh hoạt hơn.
Hội trường Garrett

1
@ElYusubov, bạn có thể đặt độ dài trường thành cài đặt trong cài đặt dự án, sẽ đưa vào app.config hoặc web.config. Sau đó, nếu độ dài trường cơ sở dữ liệu thay đổi, bạn có thể thay đổi độ dài trong tệp .config mà không cần biên dịch lại và triển khai lại ứng dụng.
Kyralessa

8

Tôi không nghĩ rằng tuyên bố đó nên được áp dụng rộng rãi; nó rất cụ thể đối với Code First. Trong Code First, chú thích dữ liệu chỉ bao gồm một tập hợp con của chức năng có sẵn trong API thông thạo. Nói cách khác, có một số cấu hình mô hình nhất định chỉ có thể được thực hiện bằng API thông thạo.

Ví dụ: đây là một số điều không thể chỉ định bằng cách sử dụng các chú thích:

  • Độ chính xác của thuộc tính DateTime
  • Độ chính xác và tỷ lệ của các thuộc tính số
  • Thuộc tính Chuỗi hoặc Nhị phân có độ dài cố định
  • Một thuộc tính String là không unicode
  • Hành vi xóa các mối quan hệ
  • Chiến lược lập bản đồ nâng cao

Cá nhân, tôi có xu hướng sử dụng các chú thích dữ liệu liên quan đến xác nhận bất cứ khi nào có thể vì các công nghệ khác như MVC cũng có thể tận dụng lợi thế của chúng. Đối với mọi thứ khác, tôi thích API thông thạo hơn.


Bạn có thể đưa ra một ví dụ về những gì chỉ có thể được thực hiện bằng cách sử dụng API trôi chảy? Cũng thật thú vị khi biết lý do tại sao họ chọn làm theo cách này. Tôi đang cố gắng để hiểu các API chạy so với các phương thức và khung thực thể thông thường hơn chỉ là một ví dụ. Tôi muốn biết lý do tại sao họ thích nó hơn các thuộc tính. Đối với tôi thuộc tính có vẻ chính xác và dễ đọc hơn.
Tjaart

1
@Tjaart Tôi đã thêm một số ví dụ. Trong khi thiết kế này, có hai nguyên tắc thúc đẩy chính. Đầu tiên, cho phép các nhà phát triển lựa chọn. Một số người xem các thuộc tính là vi phạm POCO, những người khác thích bản chất khai báo của họ. Thứ hai, tận dụng các thuộc tính hiện có và chỉ giới thiệu các thuộc tính mới cho các tình huống phổ biến. Có lẽ bạn sẽ đồng ý rằng các ví dụ tôi đưa ra ở trên là tương đối hiếm.
bricelam

Tôi đã nhận thấy rằng hành vi OnDelete dường như chỉ có sẵn trong API thông thạo. Bạn có thể nghĩ tại sao họ chọn làm theo cách này? Đây thực sự là những gì tôi đang cố gắng để có được với câu hỏi này. Vi phạm POCO có thể là một lý do chính đáng nếu bạn đang chia sẻ các lớp giữa các dự án. Cuối cùng, bạn có thể kéo theo một phụ thuộc khung thực thể mà bạn không muốn nếu bạn sử dụng các thuộc tính!
Tjaart

@Tjaart, tôi không nhớ lý do chính xác. Tôi đã tham gia nhóm vào cuối tính năng Code First và không ở đây vì thiết kế của nó. Tôi sẽ xem liệu tôi có thể khiến người khác trong đội cân nhắc không.
bricelam

1

Trả lời câu hỏi của bạn được cung cấp trong liên kết.

Sau đó, bạn xác định các ràng buộc áp dụng cho tên miền của mình trong phương pháp này theo chương trình.

Về cơ bản, ít nhiều ưu tiên sử dụng các thuộc tính so với phương pháp lập trình, trong đó phương pháp lập trình có nhiều quyền kiểm soát hơn đối với thực thể. Tuy nhiên, có một cách tùy chỉnh thêm Thuộc tính để trang trí mô hình của bạn mà bạn có thể trông giống như vậy.

Khi sử dụng phương pháp này, bạn thậm chí có thể mô tả mối quan hệ giữa các bảng và cột. Tóm lại, nếu bạn sẵn sàng kiểm soát chi tiết hơn đối với tên miền của mình, bạn có thể sử dụng phương pháp mới này đi kèm với EF4.1.

Tuy nhiên, đối với các kịch bản phổ biến về xác nhận áp dụng Thuộc tính sẽ hoạt động tốt vì nó mạnh mẽ để bao quát hầu hết các trường hợp; và ngoài ra nó có thể giúp bạn tiết kiệm thời gian.


Bạn có thể minh họa làm thế nào cách lập trình cho phép bạn kiểm soát nhiều hơn? Tôi không thực sự nhận được nó vào thời điểm này.
Tjaart

Ví dụ: lấy ".IsConcurrencyToken (true)" này - bạn sẽ làm điều này như thế nào trên định nghĩa Thuộc tính?
Yusubov

[ConcurrencyCheck] <- mà thực sự có vẻ đơn giản hơn
Tjaart

nắm bắt tốt, làm thế nào bạn sẽ mô tả "quan hệ giữa các bảng và cột"?
Yusubov

[ForeignKey ("PersonId")] <- như vậy, có lẽ không đơn giản như .HasForeignKey (t => t.ProjectId), mặc dù tất cả những gì cần thiết là để ForeignKey () lấy lambda giống như giao diện trôi chảy. Nó vẫn không giải thích tại sao cái này tốt hơn cái kia.
Tjaart

0

Tôi nghĩ rằng họ đề xuất API thông thạo cho việc triển khai mã trước vì bạn mô tả rõ ràng cách các mối quan hệ được tạo trong cơ sở dữ liệu. Nếu bạn sử dụng chú thích dữ liệu, cơ sở dữ liệu được tạo bởi Entity Framework có thể không như bạn mong đợi. Ví dụ ban đầu của bạn rất đơn giản, vì vậy, giống như bạn, tôi sẽ chỉ sử dụng phương pháp chú thích dữ liệu.


Bạn có thể đưa ra một ví dụ về cơ sở dữ liệu không phải là những gì bạn mong đợi và làm thế nào một giao diện trôi chảy ngăn chặn điều này xảy ra?
Tjaart
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.