Sobes.tech
Middle

Kuidas rakendada andmebaasis või C# koodis 'üks kuni paljud' suhet?

sobes.tech AI

Vastus AI-lt

Andmebaasis:

  • Loome tabeli "ühele" (vanem) ja tabeli "palju" (lapsed).
  • Palju tabelis lisatakse väline võti, mis viitab "ühe" tabeli primaarvõtmele.
  • Näide: tabelid Companies ja Employees. Tabelis Employees on veerg CompanyId (väline võti), mis viitab Id (primaarvõti) tabelis Companies.

C# koodis:

Entity Framework Core kasutades:

  • määratletakse mudelklassid vanemale ja lastele:
  • Vanema klass sisaldab kogumit lasteobjektidest:
  • Lapse klass sisaldab viidet vanemobjektile ja välist võtit:
    public class Company
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Employee> Employees { get; set; } // Navigatsioonisõltuvus "palju"
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int CompanyId { get; set; } // Väline võti
        public Company Company { get; set; } // Navigatsioonisõltuvus "üks"
    }
    
  • Andmebaasi kontekstis määratakse suhted (mõnikord saab Entity Framework Core need määrata konventsiooni järgi):
    public class ApplicationDbContext : DbContext
    {
        public DbSet<Company> Companies { get; set; }
        public DbSet<Employee> Employees { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Selge seose määramine (pole alati vajalik)
            modelBuilder.Entity<Company>()
                .HasMany(c => c.Employees) // Ettevõttel on palju töötajaid
                .WithOne(e => e.Company) // Töötajal on üks ettevõte
                .HasForeignKey(e => e.CompanyId); // Väline võti töötaja tabelis
        }
    }
    

Ilma ORM-ita (käsitsi):

  • Andmete saamine andmebaasist JOIN-päringutega:
    // SQL-päringu näide
    // SELECT c.Name AS CompanyName, e.Name AS EmployeeName
    // FROM Companies c
    // JOIN Employees e ON c.Id = e.CompanyId;
    
  • Vastavate klasside loomine ja objektide käsitsi ühendamine pärast andmete saamist:
    public class Company
    {
        public string Name { get; set; }
        public List<Employee> Employees { get; set; } // Seotud objektide salvestamiseks kogum
    }
    
    public class Employee
    {
        public string Name { get; set; }
    }
    
    // Näide objektide loomise kohta pärast andmete saamist
    // 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" });