Загрузка...

Связи в Entity Framework

Тема в разделе C# создана пользователем гриндер 6 июн 2023. 164 просмотра

Загрузка...
  1. гриндер
    гриндер Автор темы 6 июн 2023 Разработка софта, ботов - https://zelenka.guru/threads/6583046/ 1984 14 июл 2022
    Есть класс Client, Parcel(посылка) и Transaction
    БД выстраивается по code first
    Нужно то бы в итоговой таблице Transactions были поля sender(связаное с Client отправителем), receiver(связаное с Client получателем) и parcel(связаное с посылкой)
    помогите выстроить тип отношений между таблицами и как в коде классы описать что бы Entity Framework правильно интерпритировал, мб какой нибудь fluent API еще если нужно :despair: :despair:
     
  2. ChatGPT
    ChatGPT 6 июн 2023 2253 14 мар 2023
    гриндер, для создания связей между таблицами в Entity Framework можно использовать атрибуты или Fluent API. В вашем случае, чтобы создать связь между таблицами Client, Parcel и Transaction, можно использовать следующий код:

    CSHARP

    public class Client
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Transaction> SenderTransactions { get; set; }
    public ICollection<Transaction> ReceiverTransactions { get; set; }
    }

    public class Parcel
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Transaction> Transactions { get; set; }
    }

    public class Transaction
    {
    public int Id { get; set; }
    public int SenderId { get; set; }
    public int ReceiverId { get; set; }
    public int ParcelId { get; set; }
    public Client Sender { get; set; }
    public Client Receiver { get; set; }
    public Parcel Parcel { get; set; }
    }

    public class MyDbContext : DbContext
    {
    public DbSet<Client> Clients { get; set; }
    public DbSet<Parcel> Parcels { get; set; }
    public DbSet<Transaction> Transactions { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    modelBuilder.Entity<Transaction>()
    .HasOne(t => t.Sender)
    .WithMany(c => c.SenderTransactions)
    .HasForeignKey(t => t.SenderId)
    .OnDelete(DeleteBehavior.Restrict);

    modelBuilder.Entity<Transaction>()
    .HasOne(t => t.Receiver)
    .WithMany(c => c.ReceiverTransactions)
    .HasForeignKey(t => t.ReceiverId)
    .OnDelete(DeleteBehavior.Restrict);

    modelBuilder.Entity<Transaction>()
    .HasOne(t => t.Parcel)
    .WithMany(p => p.Transactions)
    .HasForeignKey(t => t.ParcelId)
    .OnDelete(DeleteBehavior.Restrict);
    }
    }
    В этом коде мы создаем три класса: Client, Parcel и Transaction. У каждого класса есть свойство Id, которое будет использоваться как первичный ключ в соответствующей таблице. У класса Client есть два свойства типа ICollection<Transaction>, которые будут использоваться для хранения списка транзакций, отправленных и полученных клиентом. У класса Parcel также есть свойство типа ICollection<Transaction>, которое будет использоваться для хранения списка транзакций, связанных с посылкой.

    В классе Transaction мы определяем три свойства типа int: SenderId, ReceiverId и ParcelId, которые будут использоваться для хранения идентификаторов отправителя, получателя и посылки соответственно. Мы также определяем три свойства типа Client, Parcel и Transaction, которые будут использоваться для хранения связанных объектов. Для каждого из этих свойств мы определяем связь с помощью метода HasOne, указывая соответствующее свойство навигации и внешний ключ. Мы также указываем, что при удалении связанного объекта необходимо использовать поведение DeleteBehavior.Restrict, чтобы предотвратить удаление связанных объектов.

    В методе OnModelCreating мы используем Fluent API для определения связей между таблицами. Мы определяем связь между таблицами Client и Transaction, используя метод HasOne и указывая свойство навигации SenderTransactions у класса Client и свойство навигации Sender у класса Transaction. Аналогично мы определяем связь между таблицами Client и Transaction для свойства навигации ReceiverTransactions и Receiver соответственно. Мы также определяем связь между таблицами Parcel и Transaction, используя метод HasOne и указывая свойство навигации Transactions у класса Parcel и свойство навигации Parcel у класса Transaction.

    Надеюсь, это поможет вам создать связи между таблицами в Entity Framework. Если у вас есть какие-либо вопросы, не стесняйтесь задавать их.
     
    1. гриндер Автор темы
      Мужики подскажите он правильно написал?
    2. GLITCHIDDD
      гриндер, Смотря что тебе нужно, а так, вроде всё есть...
    3. vtlstolyarov
      гриндер, А запустить и проверить слабо?
Top