Jak skonfigurować relacje One-to-One lub ZeroOrOne-to-One w Entity Framework 7 Code Najpierw użyj Adnotacji danych lub Fluent Api?Relacje jeden-do-jednego w Entity Framework 7 Code First
Odpowiedz
Można zdefiniować relację OneToOne użyciu Fluent API w Entity Framework 7 poniżej
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<BlogImage> BlogImages { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasOne(p => p.BlogImage)
.WithOne(i => i.Blog)
.HasForeignKey<BlogImage>(b => b.BlogForeignKey);
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogImage BlogImage { get; set; }
}
public class BlogImage
{
public int BlogImageId { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
public int BlogForeignKey { get; set; }
public Blog Blog { get; set; }
}
I coś, co nie było oczywiste mnie, i nie ma gdzie znaleźć w dokumentacji (lub tęsknię za nią), jeśli chciałbyś, aby BlogImage miał jedną do zera lub jedną relację do bloga, zamiast jednego do jednego (np. BlogImage na własną rękę, że opcjonalnie nie odwołuje się do bloga, wystarczy tylko wprowadzić komentarz BlogImage.BlogForeignKey, np. public int? BlogForeignKey {get; set;} –
Czy ta właściwość jest naprawdę wymagana? 'public int BlogForeignKey {get; set;}' –
Powyższa odpowiedź jest absolutnie poprawne.
Tylko dla informacji czytelników: Zostało to wyjaśnione ładnie w relacjach official documentation
jeden-na-jeden
Jeden do jednego mają właściwość nawigacji referencyjny po obu stronach. Podlegają one tym samym konwencjom, co relacje jeden-do-wielu, ale unikalny indeks jest wprowadzany do właściwości klucza obcego, aby zapewnić, że tylko jedna zależna jest powiązana z każdą główną.
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public BlogImage BlogImage { get; set; }
}
public class BlogImage
{
public int BlogImageId { get; set; }
public byte[] Image { get; set; }
public string Caption { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
Uwaga
EF wybiorą jeden z podmiotów, być zależny na podstawie jego zdolności do wykrycia właściwości klucza obcego. Jeśli niewłaściwy podmiot zostanie wybrany jako zależny, możesz użyć Fluent API, aby to poprawić.
Naprawdę muszę zdefiniować tę właściwość? 'Public int BlogId {get; set;}' –
@MohammedNoureldin Właściwość 'public int BlogId {get; set;}' jest potrzebna, ponieważ '" EF wybierze jedną z encji być zależnym w oparciu o jego zdolność wykrywania właściwości klucza obcego. "Zobacz notatkę na https://docs.microsoft.com/en-us/ef/core/modeling/relationships w sekcji Jeden do jednego innych wzorów relacji. –
Przeczytaj ten [artykuł] (http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx) –