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 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 :) –
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
Cảm ơn câu trả lời sâu sắc. – Kamyar