2015-10-02 14 views
15

Tôi có hai bảng:Entity Framework 6 tùy chọn một trong những cách quan hệ

Client 
------------------------ 
Id   (string) <-- PrimaryKey 
Name   (string) 
Number  (int) 

Department:* 
------------------------ 
Id   (int) <-- Primary key 
Name   (string) 
ClientNumber (int?) 
Client  (Client, virtual) 
..... 

Bây giờ tôi muốn tạo ra một mối quan hệ không bắt buộc từ Departmant cho khách hàng (sử dụng ClientNumber). Tôi đã tạo một thuộc tính ảo trong lớp Department (Client) và bây giờ tôi cần cấu hình quan hệ bằng EntityTypeConfiguration.

không có khóa ngoài được định cấu hình trong cơ sở dữ liệu và tôi không thể thay đổi cơ sở dữ liệu. Tôi cũng không thể thay đổi Entity (class) Client.

Vì vậy, tôi cần phải thông báo cho EntityFramework rằng ClientNumber trong lớp Department có liên quan (tùy chọn) đến thuộc tính Number trong lớp Client.

Nhưng tôi không thể tìm ra cách để nói với EF rằng của Bộ ClientNumber có liên quan đến Số tài sản của khách hàng, chứ không phải khóa chính của khách hàng. (mà không thay đổi lớp thực thể của Khách hàng)

chỉnh sửa: Số Số thuộc tính trên Máy khách là duy nhất cho mỗi mục nhập.

Mối quan hệ nên kết quả trong một tuyên bố sql như thế này:

SELECT ..... 
FROM Department D LEFT OUTER JOIN Client C ON (D.ClientNumber = C.Number) 

Thật dễ dàng để làm bằng này tham gia trong LINQ, nhưng nó sẽ là tuyệt vời để chỉ:

dbContext.Departments.Include(d => d.Client) 

sử dụng một ảo tài sản trên lớp Sở chứa Khách hàng (nếu có)

+1

Nó vẫn không thể tạo quan hệ trong khung thực thể mà không sử dụng các cột khóa chính. Nếu bạn muốn nhận ra mối quan hệ đó, bạn phải bao gồm cột Id khách hàng làm cột khóa ngoài. Nếu đó là vì lý do nào đó không muốn, bạn có thể tạo một khung nhìn để mô hình hóa mối quan hệ đó. –

Trả lời

0

Rất tiếc, không thể thực hiện được. Mối quan hệ Valide trong EF cũng phải hợp lệ trong cơ sở dữ liệu, nói cách khác bảng phụ thuộc phải đề cập đến một định danh duy nhất trong bảng chính. Nếu không, hệ thống không thể đảm bảo rằng có tối đa một khách hàng cho mỗi bộ phận.

+2

Không hoàn toàn đúng. Mối quan hệ nên tham chiếu đến một thuộc tính mà EF * biết * làm khóa chính. Nó có thể là 'Client.Number', nhưng sau đó thuộc tính đó phải được định nghĩa là khóa chính trong mô hình. EF 7 sẽ hỗ trợ các phím thay thế. –

1

@Gert Arnold Đã đề cập đến điều này là chưa "có thể". Entity Framework 7 sẽ hỗ trợ Tính năng này.

Đối với những người muốn được cập nhật, dưới đây là Thảo luận/Bỏ phiếu tính năng.

Unique Constraint (i.e. Candidate Key) Support

0

Là một khắc phục, bạn sẽ có thể thêm cả ClientId và tài sản ClientNumber? Bạn có thể truy cập ClientNumber từ thuộc tính Máy khách ảo sau khi đảm bảo rằng Máy khách không phải là rỗng:

public class Client 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public int Number { get; set; } 
    } 

    public class Department 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string ClientId { get; set; } 

     public virtual Client Client { get; set; } 

     [NotMapped] 
     public int? ClientNumber { 
      get { 
       return Client != null ? Client.Number : null; 
      } 
     } 
    } 
Các vấn đề liên quan