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
risposta
È 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; }
}
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;} –
Questa proprietà è veramente necessaria? 'public int BlogForeignKey {get; set;}' –
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ò.
Do Ho davvero bisogno di definire questa proprietà? 'Public int BlogId {get; set;}' –
@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. –
Leggi questo [articolo] (http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx) –