2017-03-03 22 views
6

Vẫn quen với khung Entity nhưng tôi đã nhìn thấy mã như dưới đây, nơi họ có setter riêng cho id trong Entity.lý do tại sao có setter riêng trong thực thể

public int Id { get; private set; } 
public string FirstName { get; set; } 
public string LastName { get; set; } 

Tại sao một số người nên đặt riêng tư. Trường Id này được tự động tạo trong cơ sở dữ liệu và đó có phải là lý do được đặt thành riêng tư không?

Ngoài ra tại sao chúng ta cần hàm tạo riêng và hàm tạo công khai trong thực thể như dưới đây?

private Emp() { } 

public Emp(string name, string lastname) 
{ 
    FirstName = firstname; 
    LastName = lastname;  
} 

Trả lời

8

Bạn không bao giờ cần phải thiết lập giá trị cột chính mình, chính xác bởi vì nó autogenerated bởi cơ sở dữ liệu, vậy tại sao cho phép để làm những việc mà không có ý nghĩa? Do đó bạn đặt Id setter riêng tư. EF vẫn có thể thiết lập thuộc tính này khi vật chất hóa đối tượng, mặc dù nó là riêng tư.

Câu chuyện tương tự với hàm tạo. EF yêu cầu thực thể của bạn phải có hàm tạo tham số, nhưng nó có thể là riêng tư. Nhưng bạn không muốn (trong ví dụ của bạn) cho thực thể được tạo ra bởi người dùng mà không cung cấp tên và họ, bởi vì rất có thể những tên đó là bắt buộc và bạn muốn không thể tránh khỏi thể hiện ý định này. Vì vậy, bạn có một hàm tạo cho bạn để tạo ra thực thể (với cả hai tên được đặt) và một cho EF để hiện thực hóa đối tượng nhận được từ cơ sở dữ liệu (tham số một).

Lưu ý rằng cả thiết lập riêng tư và cấu hình của các nhà xây dựng này đều không theo yêu cầu của EF. Tất cả điều này được thực hiện cho nhà phát triển thuận tiện để ngăn chặn hành vi không mong muốn (thiết lập Id trường hoặc cắt Emp thực thể mà không cung cấp tên).

+0

Ồ vì vậy bắt buộc phải có nhà xây dựng cá nhân và công khai? – Happy

+1

@ Rất vui, không bắt buộc phải có hàm tạo _parameterless_ cho EF để có thể tạo đối tượng của bạn. Nó có thể là riêng tư hoặc công khai, điều đó không quan trọng. Tất cả các nhà xây dựng khác là tùy chọn. Thông thường, mọi người chỉ cần tạo một hàm dựng không tham số công khai (hoặc không có hàm tạo nào cả - sau đó hàm tạo không tham số được tạo tự động). Nhưng trong tác giả ví dụ của bạn muốn _prevent_ tạo Emp mới mà không cung cấp tên và họ (để nhà phát triển không quên làm điều đó), vì vậy bạn có hai nhà xây dựng một trong số đó là riêng tư. – Evk

+0

bạn có nghĩa là nó không bắt buộc? – Happy

4

Thiết lập riêng tư hữu ích để cung cấp thuộc tính chỉ đọc cho người dùng, có nghĩa là nó sẽ không cho phép bạn sửa đổi nó. Bởi vì một số thuộc tính như ID bạn không muốn nó sửa đổi hoặc, nếu bạn muốn thêm một số xác nhận hoặc thiết lập thuộc tính ở cấp lớp (từ trong lớp). Trong trường hợp đó, chúng tôi sử dụng thiết lập riêng tư như thế nào.

public int Id { get; private set; } 

hoặc một số thời điểm như thế

private int Id ; 
public int Id 
{ 
    get { return Id ; } 
} 
1

Ngoài các câu trả lời được cung cấp, với việc giới thiệu C# 6.0, bạn không còn cần bộ định vị riêng để đặt giá trị của thuộc tính.

Bạn có thể sử dụng đoạn mã sau thay vì setters tin:

public class Appointment 
{ 
    public DateTime TimeStamp { get; } = DateTime.UtcNow; 
    public string User { get; } = 
    System.Security.Principal.WindowsPrincipal.Current.Identity.Name; 
    public string Subject{ get; } = "New Subject" 
} 

Bạn có thể kiểm tra here để biết thêm thông tin

Đối với xây dựng tư nhân: nhà xây dựng tư nhân đang sử dụng bạn không muốn một lớp học để được tạo bởi mã bên ngoài lớp. Singletons, factories, static method objects là các ví dụ về nơi hữu ích để hạn chế hàm tạo.

+0

Còn về constructor thì sao? – Happy

Các vấn đề liên quan