Sobes.tech
Middle

Kā īstenot daudz-uz-daudz saiti C#?

sobes.tech AI

Atbilde no AI

"Daudzskaitlis uz daudz" saistība C# ar Entity Framework Core parasti tiek īstenota caur starpposma (savienojošās) tabulas.

Īstenošanas soļi:

  1. Sastāvdaļu izveide: Definējiet divas sastāvdaļu klases abām saistības pusēm.
  2. Starpposma sastāvdaļas izveide: Izveidojiet atsevišķu sastāvdaļu klasi starpposma tabulai. Šī sastāvdaļa saturēs ārējos atslēgas uz abām saistītajām sastāvdaļām un, ja vēlaties, papildu īpašības, kas raksturo pašu saistību.
  3. Attiecību konfigurēšana DbContext: Jūsu OnModelCreating metodē konfigurējiet attiecības starp starpposma sastāvdaļu un divām galvenajām sastāvdaļām. Izmantojiet HasMany, WithMany, UsingEntity metodes, lai skaidri noteiktu starpposma tabulu.

Piemērs:

Pieņemsim, jums ir sastāvdaļas Book un Author, un viena grāmata var tikt rakstīta ar vairākiem autoriem, bet viens autors var rakstīt vairākas grāmatas.

// Sastāvdaļa 1
public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public ICollection<BookAuthor> BookAuthors { get; set; }
}

// Sastāvdaļa 2
public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<BookAuthor> BookAuthors { get; set; }
}

// Starpposma sastāvdaļa
public class BookAuthor
{
    public int BookId { get; set; }
    public Book Book { get; set; }

    public int AuthorId { get; set; }
    public Author Author { get; set; }

    // Papildu īpašības, piemēram, autora loma grāmatā
    public string Role { get; set; }
}
// Konfigurācija DbContext
public class ApplicationDbContext : DbContext
{
    public DbSet<Book> Books { get; set; }
    public DbSet<Author> Authors { get; set; }
    public DbSet<BookAuthor> BookAuthors { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BookAuthor>()
            .HasKey(ba => new { ba.BookId, ba.AuthorId }); // Kompozītmā galvenā atslēga

        modelBuilder.Entity<BookAuthor>()
            .HasOne(ba => ba.Book)
            .WithMany(b => b.BookAuthors)
            .HasForeignKey(ba => ba.BookId);

        modelBuilder.Entity<BookAuthor>()
            .HasOne(ba => ba.Author)
            .WithMany(a => a.BookAuthors)
            .HasForeignKey(ba => ba.AuthorId);
    }
}

Lietošana:

// Grāmatas un autora pievienošana
var book = new Book { Title = "My Awesome Book" };
var author = new Author { Name = "Jane Doe" };

var bookAuthor = new BookAuthor {
    Book = book,
    Author = author,
    Role = "Primārais autors"
};

_context.Books.Add(book);
_context.Authors.Add(author);
_context.BookAuthors.Add(bookAuthor);

_context.SaveChanges();

// Iegūt grāmatu ar autoriem
var bookWithAuthors = _context.Books
    .Include(b => b.BookAuthors)
    .ThenInclude(ba => ba.Author)
    .FirstOrDefault(b => b.Id == book.Id);

// Iegūt autoru ar grāmatām
var authorWithBooks = _context.Authors
    .Include(a => a.BookAuthors)
    .ThenInclude(ba => ba.Book)
    .FirstOrDefault(a => a.Id == author.Id);

Šī pieeja ar starpposma sastāvdaļu ir ieteicama EF Core, jo tā ļauj elastīgi pārvaldīt papildu datus par pašu saistību. Vienkāršākos gadījumos EF Core var automātiski izveidot slēptu starpposma tabulu, bet skaidra sastāvdaļu definīcija nodrošina lielāku kontroli.