8

Come configurare le relazioni One-to-One o ZeroOrOne-to-One nel codice Entity Framework 7 utilizzando prima le annotazioni di dati o l'API Fluent?Relazioni one-to-one nel codice Entity Framework 7

+1

Leggi questo [articolo] (http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx) –

risposta

20

È possibile definire relazione OnetoOne utilizzando API Fluente in Entity Framework 7 come di seguito

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

E qualcosa che non era ovvio a me, e non è possibile trovarlo nella documentazione (o l'ho perso), se si desidera che BlogImage abbia una relazione uno a zero o una sola con Blog, invece di una a una (cioè una BlogImage a sua scelta che facoltativamente non fa riferimento a un Blog, devi semplicemente rendere BlogImage.BlogForeignKey nullable, come questo: public int? BlogForeignKey {get; set;} –

+2

Questa proprietà è veramente necessaria? 'public int BlogForeignKey {get; set;}' –

2

La risposta di cui sopra è assolutamente corretto.

Solo per informazioni i lettori: Questo è stato spiegato bene in official documentation

One-to-one

Uno a uno i rapporti avere una proprietà di navigazione di riferimento su entrambi i lati. Seguono le stesse convenzioni delle relazioni uno-a-molti, ma viene introdotto un indice univoco sulla proprietà della chiave esterna per garantire che solo un dipendente sia correlato a ciascun principale.

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

Nota

EF sceglierà una delle entità di essere dipendenti in base alla sua capacità di rilevare una proprietà chiave esterna. Se l'entità errata viene scelta come dipendente, è possibile utilizzare l'API Fluent per correggere ciò.

+2

Do Ho davvero bisogno di definire questa proprietà? 'Public int BlogId {get; set;}' –

+1

@MohammedNoureldin La proprietà 'public int BlogId {get; set;}' è necessaria perché '" EF sceglierà una delle entità essere dipendente in base alla sua capacità di rilevare una proprietà di chiave esterna. "' Vedere la nota in https://docs.microsoft.com/en-us/ef/core/modeling/relationships nella sezione One-to-one di altri modelli di relazione. –