2013-03-12 30 views
11

Sau đây là hai bảng một phần trong đó tôi đang cố gắng xác định mối quan hệ khóa ngoại.Tạo mối quan hệ thực thể với các trường được đổi tên và khóa không chính trong bảng chính

public class Form 
{ 
    [Key, Column("FormID")] 
    public System.Guid FormGUID { get; set; } 

    [Column("PatGUID")] 
    public Nullable<System.Guid> PatientGUID { get; set; } 
} 

public class Patient 
{ 
    [Column("PatGUID")] 
    public System.Guid PatientGUID { get; set; } 

    [Key, Column("PatID")] 
    public int PatientID { get; set; } 

}

tôi đã loại bỏ tất cả nhưng thông tin, lĩnh vực, điều hướng có liên quan, vv cho ví dụ này; hy vọng không quá nhiều.

Chúng tôi có Biểu mẫu bảng, có FK là PatGUID đối với bảng Bệnh nhân có trường PatGUID. Bảng bệnh nhân có trường PatID int KEY.

Chúng tôi có các yêu cầu để đổi tên trường của chúng tôi cho các mô hình thực thể mã đầu tiên của chúng tôi; các trường có liên quan trong ví dụ này cần thay đổi là PatGUID được thay đổi thành PatientGUID.

Khó khăn mà tôi đang gặp là cố gắng xác định khóa ngoại này bằng cách sử dụng chú thích hoặc thông thạo.

Vì vậy, kết quả cuối cùng tôi cần là:

  • Primary Key Bảng: Bệnh nhân, Field: PatGUID (đổi tên PatientGUID)

  • Ngoại Bảng chính: Mẫu, Field: PatGUID (đổi tên thành PatientGUID)

Điều này dường như không phải là vấn đề lớn nhưng với sự kết hợp của Patient.PatGUID không phải là khóa chính và các trường PatGUID được đổi tên thành PatientGUID đã không cho phép Dịch vụ Dữ liệu WCF tạo đúng tham chiếu với tham chiếu thích hợp như vậy lựa chọn/tham gia thích hợp của:

SELECT … FROM [dbo].[Form] AS [Extent1] 
INNER JOIN [dbo].[Patient] AS [Extent2] ON [Extent1].[PatGUID] = [Extent2].[PatGUID] 

Trả lời

14

EF chưa hỗ trợ các mối quan hệ mà khóa chính không phải là khóa chính nhưng một số cột khác có ràng buộc khóa duy nhất. Nó là on the feature request list nhưng không được triển khai cũng như trên bản đồ đường cho bản phát hành kế tiếp (EF 6). Nếu nó được thực hiện ở tất cả (trong EF 7 có thể) mong đợi để chờ một năm hoặc nhiều hơn cho đến khi nó đã sẵn sàng cho sản xuất.

Trong mô hình EF cụ thể của bạn không nhận ra bất kỳ mối quan hệ giữa FormPatient ở tất cả vì Patient.PatientID được đánh dấu là [Key], không Patient.PatientGUID, và EF đối xử với Form.PatientGUID như một tài sản vô hướng bình thường, không phải là một FK để Patient.

Về lý thuyết, bạn có thể giả mạo Patient.PatientGUID là thuộc tính [Key] trong mô hình mặc dù nó không phải là khóa chính trong cơ sở dữ liệu nếu bạn không tạo mô hình từ cơ sở dữ liệu hoặc cơ sở dữ liệu từ mô hình mã đầu tiên. , nếu bạn ánh xạ theo cách thủ công giữa mô hình và (hiện có) cơ sở dữ liệu. Nhưng tôi không chắc chắn nếu điều này sẽ không gây ra vấn đề tinh tế bất cứ nơi nào khác.

Cách khác là viết các câu lệnh join thủ công trong LINQ nếu bạn muốn tìm nạp Patients và liên quan Forms. Sau đó, bạn có thể tham gia hai thực thể bằng cách sử dụng các thuộc tính tùy ý, không chỉ các thuộc tính quan trọng.Đây là, theo ý kiến ​​của tôi, cách tiếp cận gọn gàng hơn và ít phức tạp hơn. Tuy nhiên, nhược điểm là bạn sẽ không có thuộc tính điều hướng - tham chiếu hoặc bộ sưu tập - giữa PatientForm và bạn không thể sử dụng các tính năng như tải mong muốn (Include), tải lười biếng hoặc thoải mái "cú pháp đường dẫn chấm chấm" (như Form.Patient.SomePatientProperty, v.v. .) trong các truy vấn LINQ của bạn.

+3

Không chính xác những gì tôi muốn nghe nhưng ít nhất một câu trả lời dứt khoát về lý do tại sao tôi không thể làm việc này và biết rằng tôi cần phải đưa ra giải pháp thay thế. – user2144404

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