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