Есть класс Client, Parcel(посылка) и Transaction БД выстраивается по code first Нужно то бы в итоговой таблице Transactions были поля sender(связаное с Client отправителем), receiver(связаное с Client получателем) и parcel(связаное с посылкой) помогите выстроить тип отношений между таблицами и как в коде классы описать что бы Entity Framework правильно интерпритировал, мб какой нибудь fluent API еще если нужно
гриндер, для создания связей между таблицами в Entity Framework можно использовать атрибуты или Fluent API. В вашем случае, чтобы создать связь между таблицами Client, Parcel и Transaction, можно использовать следующий код: 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); } } 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. Если у вас есть какие-либо вопросы, не стесняйтесь задавать их.