2011-08-11 35 views
5

Tôi đang cố gắng lớp này:Một số không/một mối quan hệ (Mã đầu tiên)

public class Person 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public int SpouseID { get; set; } 
    public virtual Person Spouse { get; set; } 
} 

Các mối quan hệ là: One Person đã một hoặc không có người phối ngẫu/ Một vợ, chồng có một người yêu cầu

Có thể xây dựng mô hình này trong API thông thạo không?

Cảm ơn.

Trả lời

6

Thật không may là không thể tự thực hiện tham chiếu quan hệ một-một vì hiện tại EF không hỗ trợ khóa duy nhất. Để làm cho bản thân thực sự này, tham chiếu SpouseID một-một-một phải được đánh dấu là duy nhất. EF chỉ cho phép một đối một trên các khóa chính (khóa chính trong thực thể phụ thuộc cũng phải là khóa ngoài cho thực thể chính) có nghĩa là tự tham chiếu quan hệ một-một sẽ kết thúc trong PersonID <-> PersonID = hai thực thể với cùng một PersonID trong bảng đơn . Không thể vì PersonID là khóa chính và phải là duy nhất.

Bạn có thể xử lý nó như một-nhiều và phơi bày chỉ bất động sản chuyển hướng duy nhất là bạn cần biết:

modelBuilder.Entity<Person>() 
      .HasOptional(p => p.Spouse) 
      .WithMany() 
      .HasForeingKey(s => s.SpouseID); 

Để thực thi one-to-one mối quan hệ trong cơ sở dữ liệu, bạn sẽ thêm custom database initializer và tự tạo độc đáo chỉ mục trên cột SpouseID.

Vấn đề là nó chỉ là một cách điều hướng để bạn có thể có được người phối ngẫu của Người nhưng từ đó Spouse bạn không thể lấy lại cho chồng.

+0

Cảm ơn sự giúp đỡ của bạn Ladislav – Joao

1

Câu trả lời này là đề xuất thay vì câu trả lời chính xác.

Trong kịch bản thế giới thực, đây không phải là thiết kế chính xác, trước hết mọi người phối ngẫu đều có vợ/chồng cùng tham chiếu cùng một người, ví dụ như vợ/chồng của người phối ngẫu là người. Chúng tôi đã mô hình hóa điều này trong ứng dụng của chúng tôi là Persons và PeronRelations, PersonRelations có thuộc tính FromPersonID, ToPersonID và Type. Loại quy định cụ thể "Chồng < -> Wife", "Vợ < -> Chồng", "Cha < -> Sơn", "Sơn < -> Cha" vv

public class Person{ 
    public int PersonID {get;set;} 
    ... 
    public ICollection<PersonRelations> FromRelations {get;set;} 
    public ICollection<PersonRelations> ToRelations {get;set;} 

} 

public class PersonRelations{ 

    .. 
    public int FromPersonID {get;set;} 
    public int ToPersonID {get;set;} 

    public RelationType Type {get;set;} 
    public Person FromPerson {get;set;} 
    public Person ToPersion {get;set;} 

    // useful for Employment and Marriage 
    // durations 
    public DateTime? Start {get;set;} 
    public DateTime? End {get;set;} 
} 

public enum RelationType{ 
    Husband_Wife, 
    Wife_Husband, 
    Father_Son, 
    Son_Father, 
    Friend_Friend, 
    Employee_Employer, 
    Employer_Employee 
} 

này mang đến cho bạn lợi thế là bạn có thể lưu trữ thêm thông tin cho mỗi mối quan hệ và điều hướng chúng theo cả hai hướng cùng với nhiều truy vấn.

Mọi mối quan hệ cũng có mối quan hệ ngược lại tương ứng. Và bạn sẽ phải viết thêm logic để duy trì mối quan hệ nghịch đảo thích hợp cũng như để cho nó hoạt động chính xác.

Và điều này rất dễ thực hiện trong khung thực thể vì nó là mối quan hệ một đến nhiều đơn giản.

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