Sobes.tech
Middle

Πώς υλοποιείται μια σχέση 'ένα προς πολλά' σε μια βάση δεδομένων ή στον κώδικα C#;

sobes.tech AI

Απάντηση από AI

Στη βάση δεδομένων:

  • Δημιουργείται ένας πίνακας για το "ένα" (τον γονέα) και ένας πίνακας για το "πολλά" (τα παιδιά).
  • Προστίθεται ένα ξένο κλειδί στον πίνακα "πολλά" που αναφέρεται στο πρωτεύον κλειδί του πίνακα "ένα".
  • Παράδειγμα: Πίνακες Companies και Employees. Στον πίνακα Employees, υπάρχει μια στήλη CompanyId (ξένο κλειδί) που αναφέρεται στο Id (πρωτεύον κλειδί) στον πίνακα Companies.

Κώδικας C#:

Με το Entity Framework Core:

  • Ορίζονται κλάσεις μοντέλων για τον γονέα και τα παιδιά.
  • Η κλάση του γονέα περιλαμβάνει μια συλλογή αντικειμένων παιδιών.
  • Η κλάση του παιδιού περιλαμβάνει μια αναφορά στο γονέα και το ξένο κλειδί.
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Ιδιότητα πλοήγησης για "πολλά"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Ξένο κλειδί
        public Company Company { get; set; } // Ιδιότητα πλοήγησης για "ένα"
    }
    
  • Στο πλαίσιο της βάσης δεδομένων, διαμορφώνονται οι σχέσεις (μερικές φορές το Entity Framework Core μπορεί να τις ανιχνεύσει βάσει συμφωνίας).
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Ρητή καθορισμός της σχέσης (δεν είναι πάντα απαραίτητο)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Μία εταιρεία έχει πολλούς υπαλλήλους
                .WithOne(e => e.Company) // Ο υπάλληλος έχει μία εταιρεία
                .HasForeignKey(e => e.CompanyId); // Ξένο κλειδί στον πίνακα Employee
        }
    }
    

Χωρίς ORM (χειροκίνητα):

  • Ανάκτηση δεδομένων από τη βάση χρησιμοποιώντας ερωτήματα JOIN.
    // Παράδειγμα SQL ερωτήματος
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Δημιουργία αντίστοιχων κλάσεων και χειροκίνητη σύνδεση αντικειμένων μετά την ανάκτηση δεδομένων.
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Συλλογή για αποθήκευση σχετικών αντικειμένων
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Παράδειγμα δημιουργίας αντικειμένων μετά την ανάκτηση δεδομένων
    // Company company = new Company { Name = "ACME Corp", Employees = new List<Employee>() };
    // company.Employees.Add(new Employee { Name = "Alice" });
    // company.Employees.Add(new Employee { Name = "Bob" });