2009-07-15 38 views
28

Giả sử tôi có một đối tượng Employee với các thuộc tính sau:tính Tính trong Entity Framework

string Name { get; } 
float Hours { get; } 
float Wage { get; } 

Tôi muốn thêm một tài sản, tiền lương, bằng giờ * lương. Trong một đối tượng kinh doanh thông thường, tôi chỉ đơn giản là mã hóa nó trong tài sản, nhưng điều này có lẽ sẽ bị xóa sổ nếu lớp cần được tái sinh.

Có một cách tiêu chuẩn EF để thực hiện điều này mà không phải trải qua những rắc rối của việc lập bản đồ nó vào một tổ chức cơ sở dữ liệu?

Trả lời

50

Thật vậy. Tạo một tệp riêng biệt, ví dụ: EmployeeExtension.cs.

Trong tập tin này, đặt đoạn mã sau:

public partial class Employee 
{ 
    public decimal Salary 
    { 
     get { return Hours * Wage; } 
    } 
} 

LINQ đến các lớp học SQL và Entity Framework được tạo ra với phần từ khóa để cho phép bạn chia các định nghĩa trên nhiều tập tin, vì các nhà thiết kế biết bạn sẽ muốn thêm thành viên vào lớp không bị ghi đè bằng cách liên tục tự động phát tệp nguồn cơ sở.

+0

Tuyệt vời! Tôi đã tạo ra các lớp bóng tối, hoàn toàn đau đớn. Cảm ơn nhiều –

+1

Điều này dường như không hoạt động với LINQ to Entities vì ​​nó không được định nghĩa trong mô hình dữ liệu thực tế. Có cách nào để xác định một trường được tính toán trong * .edmx không? – AaronLS

+0

Bạn có thể cụ thể hơn "dường như không hoạt động" không? Nếu bạn đang đề cập đến các cột với các giá trị được tính toán ở cấp cơ sở dữ liệu, đó là một con thú hoàn toàn khác. – JoshJordan

7

Nếu tôi nhớ chính xác các lớp được tạo ra bởi EF là một phần. Vì vậy, bạn có thể có thể thêm một tập tin có chứa một partial class (cùng không gian tên, cùng classname dĩ nhiên) mà hơn thực hiện các tài sản

public single Salary 
{ 
    get 
    { 
     return this.Hours * this.Wage; 
    } 
} 

Nên làm các trick (nếu những người độc thân không nullable, tâm trí bạn!)

5

Bạn có thể triển khai thuộc tính trong lớp thực thể. Khung thực thể sẽ tạo ra các lớp một phần cho phép bạn thêm các thành viên vào lớp. Thêm một lớp học như thế này vào mã của bạn:

public partial class Employee { 
    public Single Salary { 
    get { return Hours*Wage; } 
    } 
} 
6

Tôi không thể nhận được câu trả lời của Argo để làm việc ban đầu. Sau một chút chơi xung quanh tôi nhận thấy rằng nếu tôi trang trí tài sản (như trong WCF), mà thuộc tính sau đây, tất cả đều làm việc tốt.

[global::System.Runtime.Serialization.DataMemberAttribute()] 

Theo 'hướng dẫn của Argo tạo một tệp riêng biệt, (ví dụ: EmployeeExtension.cs). điều này nên được đánh dấu một phần như mô tả.

Trong tập tin này, đặt đoạn mã sau:

public partial class Employee 
{ 
    [global::System.Runtime.Serialization.DataMemberAttribute()]  
    public decimal Salary  
    { 
     get { return Hours*Wage; } 
    } 
} 

Hope this helps ....

2

này đã không được làm việc cho tôi với Entity Framework 5. Các giải pháp đối với tôi là chỉ đơn giản là sử dụng [NotMapped] thuộc tính. Để biết thêm thông thấy Code First DataAnnotations

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