2011-09-15 4 views
11

ho seguenti entitàQual è la differenza tra HasRequired e HasOptional

public class SchoolContext : DbContext 
    { 
     public DbSet<Address> Addresses { get; set; } 
     public DbSet<Employee> Employees { get; set; }  
    } 

    public class Address 
    { 
     public int Id { get; set; } 
     public string Street { get; set; } 

     public virtual Employee Employee { get; set; } 
    } 

    public class Employee 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     public virtual Address Address { get; set; } 
    } 

Se ho impostato rapporto tra dipendenti e affrontare con i seguenti API perfetto

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      // Option #1 
      modelBuilder.Entity<Employee>() 
         .HasRequired(s => s.Address) 
         .WithRequiredPrincipal(a => a.Employee); 

      // Option #2 
      modelBuilder.Entity<Employee>() 
         .HasOptional(s => s.Address) 
         .WithRequired(a => a.Employee); 

     } 

Sopra due opzioni creare la struttura della tabella esattamente lo stesso, se quindi, ciò che è diverso tra due opzioni. Se vado con l'opzione n. 1, ho pensato che l'entità dipendente avrebbe sempre un'entità indirizzo, ma non lo era. Sono stato in grado di salvare l'entità Employee senza valore dell'indirizzo.

Grazie in anticipo.

+0

Vuol 'HasRequired' funzionano solo dal Discorso ai dipendenti? Quindi se si specifica 'HasRequired' non è possibile salvare un indirizzo senza un dipendente collegato. Ma puoi sempre salvare un dipendente indipendentemente dal fatto che abbia un indirizzo o meno, in quanto la tabella dei dipendenti non ha una chiave esterna che si riferisce alla tabella degli indirizzi. – ipr101

+0

Volevo creare una relazione uno-a-uno tra due entità. Come hai detto, non sono in grado di salvare l'indirizzo senza dipendente collegato. Questo è successo in due opzioni. In caso affermativo, sopra due opzioni non sono diversi? Come ho chiesto, mi aspettavo che salvare la dipendente senza indirizzo collegato non fosse possibile nella prima opzione, ma mi sbagliavo. – Ray

risposta

8

Solo in base al significato di HasRequired e HasOptional, mi aspetto che l'opzione # 1 imponga l'indirizzo e non consenta di creare un dipendente senza specificare un indirizzo e che l'opzione n. 2 consenta di creare un dipendente con un indirizzo opzionale.

HasRequired
di configurare un rapporto richiesto da questo tipo di entità. Le istanze di il tipo di entità non potranno essere salvate nel database a meno che non sia specificata la relazione . La chiave esterna nel database sarà non annullabile.

HasOptional
Configura un rapporto opzionale da questa entità tipo. Le istanze del tipo di entità potranno essere salvate nel database senza che venga specificata questa relazione. La chiave esterna in il database sarà annullabile.

http://msdn.microsoft.com/en-us/library/gg671317%28v=vs.103%29.aspx
http://msdn.microsoft.com/en-us/library/gg671230%28v=vs.103%29.aspx