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); // Արտաքին բանալի աշխատակիցների աղյուսակում
        }
    }
    

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