2012-04-12 34 views
8

Tôi đã tạo lớp POCO sau và cũng làm cho các đặc tính Contact.FirstNameContact.LastName riêng tư (các thuộc tính này được ánh xạ tới các thuộc tính thích hợp trong mô hình Khung thực thể).Khuôn khổ thực thể, POCO và thuộc tính riêng

public class Contact 
{ 
    public int ContactID { get; set; } 
    private string FirstName { get; set; } 
    public string LastName { get; private set; } 
} 

Tôi dự kiến ​​sẽ có ngoại lệ do EF không thể gán giá trị cho hai thuộc tính này, nhưng bằng cách nào đó EF vẫn quản lý để gán giá trị cho chúng. Làm thế nào là có thể, vì chỉ có mã trong lớp Contact nên có quyền truy cập vào các thuộc tính riêng tư?

Cảm ơn bạn

+31

Khuôn khổ thực thể là phép thuật. Nó có thể làm bất cứ điều gì nó muốn. –

+0

Bạn có mã lập bản đồ nào không? Việc ánh xạ các thuộc tính riêng tư mà không cần cấu hình rõ ràng (hoặc chú thích trong EF 4.3) thực sự không hoạt động dễ dàng như vậy: http://blog.oneunicorn.com/2012/03/26/code-first-data-annotations-on-non-public- thuộc tính/ – Slauma

+0

@Slauma: Tôi đang sử dụng phương pháp tiếp cận cơ sở dữ liệu đầu tiên – user702769

Trả lời

16

Trong môi trường với đủ mức độ tin tưởng, reflection thể được sử dụng để truy cập các thành viên mà người ta thường không có quyền truy cập.

+0

Vì vậy, đây cũng là cách Dự án thử nghiệm có thể truy cập vào các thành viên riêng tư? – McGarnagle

+2

@dbaseman: vâng, nhưng cũng có một 'InternalsVisibleAttribute' đôi khi được sử dụng bởi mã được thử nghiệm để làm cho các thành viên' nội bộ 'của nó có thể truy cập vào các bài kiểm tra đơn vị mà không cần sự phản chiếu. –

+0

cảm ơn tất cả vì sự giúp đỡ của bạn – user702769

0

Có - EF, mã đầu tiên đang sử dụng ở một vài nơi.

Tôi đã nhìn thấy hành vi tương tự với các nhà xây dựng tư nhân - EF/CF vẫn có thể xây dựng các đối tượng của bạn ngay cả khi bạn 'ẩn' hoặc cố gắng :) (đó là hành vi trong các phiên bản trước đó, không chắc chắn bây giờ) . Và tôi nhớ có một số cuộc thảo luận với những người CF về lý do tại sao họ không khởi tạo các thuộc tính kiểu phức tạp - so với họ vẫn ổn khi truy cập các thành viên riêng tư (nếu tôi nhớ chính xác), đã lâu rồi.

Vì vậy, một chút câu hỏi chung - nhưng theo nghĩa đó, hy vọng điều này sẽ làm rõ điều gì đó ít nhất.

1

Vì lý do đầy đủ: mã EF5 đầu tiên không (ít nhất là theo mặc định) ánh xạ các thuộc tính riêng tư thành cột bảng cơ sở dữ liệu.

Lớp sau:

public class Person { 
    public int PersonId { get; set; } 
    private string Name { get; set; } 
} 

Với DbContext sau:

public class PrivatePropertiesContext : DbContext { 
    public DbSet<Person> People { 
    get; 
    set; 
    } 
} 

Tạo một bảng Những người có chỉ có một cột: dbo.People.PersonId (PK, int, not null)

Một tài sản khóa công khai là yêu cầu của mã mặc định các công ước đầu tiên. Nếu thuộc tính PersonId trong lớp Person sẽ là riêng tư hoặc được bảo vệ, khung pháp nhân sẽ ném ngoại lệ sau:

System.Data.Entity.Edm.EdmEntityType: : EntityType 'Person' has no key defined. Define the key for this EntityType. 
System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'People' is based on type 'Person' that has no keys defined. 
Các vấn đề liên quan