Odpowiedz

20

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; } 
} 
+0

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;} –

+2

Czy ta właściwość jest naprawdę wymagana? 'public int BlogForeignKey {get; set;}' –

2

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ć.

+2

Naprawdę muszę zdefiniować tę właściwość? 'Public int BlogId {get; set;}' –

+1

@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. –