7

Tôi đang sử dụng EntityFramework 5 (hoặc 4.3 cho .Net Framework 4.0)EntityFramework vô danh ghép tên thuộc tính quan trọng xung đột

Trong đối tượng DbContext của tôi, tôi đã thiết lập các DbSets chính xác và các đối tượng chứa tài liệu tham khảo phù hợp với nhau. Điều này không mới đối với tôi, và mọi thứ đang hoạt động tốt.

Bây giờ trong trường hợp này, tôi có một số phím tổng hợp, đôi khi, bao gồm khóa ngoài của bảng (hoặc đối tượng trong trường hợp này). Đối với điều này, tôi sử dụng hàm HasKey<>() trên phương thức OnModelCreating của DbContext. Khi các thuộc tính này có các tên khác nhau, không có vấn đề gì, nhưng khi các thuộc tính này có cùng tên, việc di chuyển không thể thực hiện được.

Một ví dụ:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // ... 

     modelBuilder.Entity<PatientVisit>().ToTable("PatientVisits"); 
     modelBuilder.Entity<PatientVisit>().HasKey(x => 
      new { x.Patient.Code, x.Code }); 

     // ... 

     base.OnModelCreating(modelBuilder); 
    } 

Như bạn có thể nhìn thấy trong mã được cung cấp, đối tượng PatientVisit có một tài sản mang tên Mã, nhưng khách sạn này có thể được lặp đi lặp lại như miễn là nó được lặp lại với một bệnh nhân khác nhau. Thực thể Bệnh nhân cũng có một khóa được định nghĩa có tên Mã.

Loại ẩn danh không thể có hai thuộc tính phỏng đoán cùng một tên (hiển nhiên). Giải pháp điển hình là đặt tên cho thuộc tính của loại ẩn danh như sau:

Nhưng làm như vậy, khi tôi cố gắng thêm di chuyển, thông báo lỗi này được ném.

The properties expression 'x => new <>f__AnonymousType3`2(PatientCode 
= x.Patient.Code, VisitCode = x.Code)' is not valid. The expression 
should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) 
t.MyProperty'. When specifying multiple properties use an anonymous 
type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' 
VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'. 

Trả lời

0

Tôi nghĩ rằng những gì bạn cần làm ở đây được cung cấp cho một tài sản PatientVisitPatientCode mới. Mà sẽ là chìa khóa nước ngoài để Patient. Ví dụ:

HasRequired<PatientVisit>(v => v.Patient).WithMany() 
              .HasForeignKey(v => v.PatientCode) 

Sau đó, bạn có thể làm

modelBuilder.Entity<PatientVisit>().HasKey(x => 
     new { x.PatientCode, x.Code }); 
+1

Tôi biết có những giải pháp mà yêu cầu tôi để thêm bằng tay Keys và Id của các đối tượng tham chiếu, nhưng điều đó ngụ ý "thay đổi", một mô hình đối tượng đơn giản để một cơ sở dữ liệu mô hình lập bản đồ và tôi không muốn làm điều đó. –

+0

Giải pháp của bạn tương tự như giải pháp mà tôi đã triển khai, chỉ rằng không cần lập bản đồ lưu loát vì nó được thực hiện bởi DataAnnotations. Về cơ bản, nó sử dụng thuộc tính 'ForeignKey' để đính kèm thuộc tính được khai báo vào khóa ngoài của thuộc tính điều hướng ảo ... nhưng nó ngụ ý rằng _i phải định nghĩa rõ ràng các thuộc tính navigation _and_ thuộc tính anchor hoặc ngoại. Tôi muốn có một mô hình đối tượng gọn gàng, gọn gàng mà không có bất kỳ thuộc tính khóa liên quan đến cơ sở dữ liệu nào. –

+0

Ví dụ về giải pháp _current-but-not-wanted_ mà tôi đang đề cập đến, xem [this thread] (http://stackoverflow.com/questions/5388077/primary-foreign-key-in-entity-framework) nơi nó được giải thích rất tốt. –

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