2011-04-19 25 views
36

Chỉ muốn biết thêm về thuộc tính RelatedTo và tôi phát hiện ra nó đã được thay thế bởi ForeignKeyInverseProperty thuộc tính trong EF 4.1 RC.Entity Framework 4.1 Thuộc tính InverseProperty

Có ai biết bất kỳ tài nguyên hữu ích nào về các tình huống mà thuộc tính này trở nên hữu ích không?

Tôi có nên sử dụng thuộc tính này trên các thuộc tính điều hướng không? ví dụ:

public class Book 
{ 
    public int ID {get; set;} 
    public string Title {get; set;} 

    [ForeignKey("FK_AuthorID")] 
    public Author Author {get; set;} 
} 

public class Author 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
    // Should I use InverseProperty on the following property? 
    public virtual ICollection<Book> Books {get; set;} 
} 

Trả lời

80

Tôi thêm ví dụ cho InversePropertyAttribute. Nó có thể không chỉ được sử dụng cho các mối quan hệ trong tổ chức tự tham khảo (như trong ví dụ liên kết trong câu trả lời Ladislav của) mà còn trong trường hợp "bình thường" của mối quan hệ giữa các thực thể khác nhau:

public class Book 
{ 
    public int ID {get; set;} 
    public string Title {get; set;} 

    [InverseProperty("Books")] 
    public Author Author {get; set;} 
} 

public class Author 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 

    [InverseProperty("Author")] 
    public virtual ICollection<Book> Books {get; set;} 
} 

này sẽ mô tả các mối quan hệ tương tự như thế này Mã thông thạo:

modelBuilder.Entity<Book>() 
      .HasOptional(b => b.Author) 
      .WithMany(a => a.Books); 

... hoặc ...

modelBuilder.Entity<Author>() 
      .HasMany(a => a.Books) 
      .WithOptional(b => b.Author); 

Bây giờ, thêm các InverseProperty thuộc tính trong ví dụ trên là redundan t: Các quy ước lập bản đồ sẽ tạo ra mối quan hệ đơn tương tự.

Nhưng xem xét ví dụ này (của một thư viện sách mà chỉ chứa những cuốn sách viết chung với nhau bởi hai tác giả):

public class Book 
{ 
    public int ID {get; set;} 
    public string Title {get; set;} 

    public Author FirstAuthor {get; set;} 
    public Author SecondAuthor {get; set;} 
} 

public class Author 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 

    public virtual ICollection<Book> BooksAsFirstAuthor {get; set;} 
    public virtual ICollection<Book> BooksAsSecondAuthor {get; set;} 
} 

Việc lập bản đồ công ước sẽ không phát hiện mà kết thúc của những mối quan hệ thuộc về nhau và thực sự tạo bốn mối quan hệ (với bốn khóa ngoại trong bảng Sách). Trong tình huống này bằng cách sử dụng InverseProperty sẽ giúp xác định các mối quan hệ đúng chúng ta muốn trong mô hình của chúng tôi:

public class Book 
{ 
    public int ID {get; set;} 
    public string Title {get; set;} 

    [InverseProperty("BooksAsFirstAuthor")] 
    public Author FirstAuthor {get; set;} 
    [InverseProperty("BooksAsSecondAuthor")] 
    public Author SecondAuthor {get; set;} 
} 

public class Author 
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 

    [InverseProperty("FirstAuthor")] 
    public virtual ICollection<Book> BooksAsFirstAuthor {get; set;} 
    [InverseProperty("SecondAuthor")] 
    public virtual ICollection<Book> BooksAsSecondAuthor {get; set;} 
} 

Ở đây chúng ta sẽ chỉ có được hai mối quan hệ. (Lưu ý: Thuộc tính InverseProperty chỉ cần thiết ở một đầu mối quan hệ, chúng tôi có thể bỏ qua thuộc tính ở đầu kia.)

+1

+1 Tốt. Tôi hy vọng bạn sẽ đến và giải thích nó nhiều hơn một chút để có được một số khoản tín dụng :) –

+7

Lol! Nhưng bằng cách nào đó thuộc tính này là không có đất giữa các công ước và lập bản đồ thành thạo: Đối với các mối quan hệ đơn giản, nó không cần thiết và cho các mối quan hệ phức tạp, mọi người sẽ sử dụng mã Fluent.Có lẽ lý do tại sao nó không phổ biến và lời giải thích duy nhất tôi có thể nghĩ tại sao ngay cả * bạn * không biết điều đó :) – Slauma

+1

Cảm ơn câu trả lời sâu sắc. – Kamyar

28

ForeignKey cặp thuộc tính Thuộc tính FK với thuộc tính điều hướng. Nó có thể được đặt trên thuộc tính FK hoặc thuộc tính điều hướng. Nó tương đương với HasForeignKey ánh xạ thông thạo.

public class MyEntity 
{ 
    public int Id { get; set; } 

    [ForeignKey("Navigation")] 
    public virtual int NavigationFK { get; set; } 

    public virtual OtherEntity Navigation { get; set; } 
} 

InverseProperty được sử dụng để xác định mối quan hệ tự tham chiếu và ghép nối thuộc tính điều hướng ở cả hai đầu. Kiểm tra this question for sample.

+2

Ha! Bạn đã trở lại! Cảm ơn EF guru! – Kamyar

+0

Vì vậy, nếu tôi có kịch bản chi tiết chính (EF4.2), tôi phải trang trí các thuộc tính gì (tôi có phải) không? Giả sử tôi có một lớp 'Master' với thuộc tính ảo' Detail: ICollection 'và một lớp' Detail' với thuộc tính ảo 'Master'. – Shimmy

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