Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225

Code First: Как в конфигурации создать связь один-ко-многим и наоборот?

03.01.2025, 08:20. Показов 964. Ответов 10

Студворк — интернет-сервис помощи студентам
Погуглив, выдает только настройки конфигурации непосредственно в DbContext классе, а там у modelBuilder есть Entity.


C#
1
2
3
4
5
public record Set
{
    public required string Name { get; set; }
    public List<Word>? Words { get; set; }
}
C#
1
2
3
4
5
public record Word
{
    public int SetId { get; set; } // Foreign Key
    public required Set Set { get; set; } // Принадлежность к сущности
}

Пример из интернета
C#
1
2
3
4
modelBuilder.Entity<Student>()
            .HasOne<Grade>(s => s.Grade)
            .WithMany(g => g.Students)
            .HasForeignKey(s => s.CurrentGradeId);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2025, 08:20
Ответы с готовыми решениями:

Entity Framework 6. Code First. Связь один-ко-многим и многие-ко-многим одновременно
Здрасти. Есть таблица юзеров и объявлений. У юзера может быть множество объявлений. Здесь действует связь один-ко-многим. Но юзер также...

Как создать связь один ко многим?
ребят, имеется таблица users и таблица audio у таблицы users такие столбцы: id login password email sex date_dirth id_audio

Как создать связь один ко многим?
подскажите пожалуйста как в делфи можно организовать связь таблиц один ко многим, напиши пожалуйста подробнее я новичек

10
Эксперт .NET
 Аватар для Rius
13084 / 7644 / 1670
Регистрация: 25.05.2015
Сообщений: 23,274
Записей в блоге: 14
03.01.2025, 09:51
Это не WPF.
С. https://learn.microsoft.com/en... ne-to-many
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.01.2025, 10:02  [ТС]
Rius, в документации по ссылке происходит как раз то, что я и описал.
0
Эксперт .NET
 Аватар для Rius
13084 / 7644 / 1670
Регистрация: 25.05.2015
Сообщений: 23,274
Записей в блоге: 14
03.01.2025, 10:05
Замечательно.
В чём проблема с тем, чтобы сделать так, как в документации указано?
Нежелание создавать поле Id?
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.01.2025, 10:09  [ТС]
Rius, Насколько это грамотно? Ведь помимо связей, у меня есть еще некоторые настройки.

Кликните здесь для просмотра всего текста
Вот одна конфигурация.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class WordConfiguration : IEntityTypeConfiguration<Word>
{
    public void Configure(EntityTypeBuilder<Word> builder)
    {
        builder.HasKey(c => c.Id);
 
        builder.OwnsOne(w => w.Set);
 
            //.WithMany<Word>
            //.HasForeignKey(c => c.SetId)
            //.OnDelete(DeleteBehavior.Cascade);
 
        builder.HasIndex(c => c.Name).IsUnique();
 
        builder.Property(c => c.Name)
            .IsRequired().HasMaxLength(100);
 
        builder.Property(c => c.Definition)
            .IsRequired().HasMaxLength(777);
 
        builder.Property(c => c.ImagePath)
            .HasMaxLength(777)
            .HasDefaultValue("");
 
        builder.Property(c => c.IsFavorite)
            .HasDefaultValue(false);
 
        builder.Property(c => c.IsLastWord)
            .HasDefaultValue(false);
    }
}
Вот вторая.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SetConfiguration : IEntityTypeConfiguration<Set>
{
    public void Configure(EntityTypeBuilder<Set> builder)
    {
        builder.HasKey(c => c.Id);
 
        builder.HasOne<Set>()
            .WithMany(w => w.Words);
 
        builder.HasIndex(c => c.Name).IsUnique();
 
        builder.Property(c => c.Name)
            .IsRequired().HasMaxLength(20);
    }
}


Не уж то все это нужно писать в методе OnModelCreating?
0
Эксперт .NET
 Аватар для Rius
13084 / 7644 / 1670
Регистрация: 25.05.2015
Сообщений: 23,274
Записей в блоге: 14
03.01.2025, 10:14
Цитата Сообщение от Vissmuy Посмотреть сообщение
Не уж то все это нужно писать в методе OnModelCreating?
Можете написать DbContext и Entity, а всё вот это будет создано автоматически миграцией (Add-Migration <name>).

Добавлено через 2 минуты
Пример автогенерируемого (но можно допилить):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
modelBuilder.Entity("Site", b =>
    {
        b.Property<int>("Id")
            .ValueGeneratedOnAdd()
            .HasColumnType("INTEGER");
 
        b.HasKey("Id");
 
        b.ToTable("Site", (string)null);
    });
 
modelBuilder.Entity("SiteBranch", b =>
    {
        b.Property<int>("Id")
            .ValueGeneratedOnAdd()
            .HasColumnType("INTEGER");
 
        b.Property<int>("SiteId")
            .HasColumnType("INTEGER");
 
        b.HasKey("Id");
 
        b.HasIndex("SiteId");
 
        b.ToTable("SiteBranch", (string)null);
    });
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.01.2025, 10:16  [ТС]
Rius, ммм, не пойму. "Можете написать DbContext" - куда я могу его написать? Создано то будет, но у меня связь то не установлена. Или вы имеете ввиду, что установку связи вынести в класс, реализующий DbContext, а все остальное оставить в конфигурационном файле?

Добавлено через 1 минуту
Цитата Сообщение от Rius Посмотреть сообщение
Пример
То есть эти конфигурационные файлы и не нужны вовсе, раз все можно сделать в классе, который наследует DbContext?
0
Эксперт .NET
 Аватар для Rius
13084 / 7644 / 1670
Регистрация: 25.05.2015
Сообщений: 23,274
Записей в блоге: 14
03.01.2025, 10:19
Можно описать сущности и их связи (в них же).
Контекст должен быть. По желанию, можно в нём переопределить protected override void OnModelCreating(ModelBuilder modelBuilder) и ещё донастроить под себя.
Потом создать миграцию.

Без отдельной реализации IEntityTypeConfiguration<T> вполне можно обойтись, если кода немного.
0
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.01.2025, 10:24  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Без отдельной реализации IEntityTypeConfiguration<T> вполне можно обойтись, если кода немного.
Предположим, что кода много. То есть нужна будет отдельная реализация IEntityTypeConfiguration<T>. Как быть в такой ситуации? Вопрос же вроде не сложный, я просто запутался в этих связях и не понимаю как надо код ниже
C#
1
2
3
4
modelBuilder.Entity<Student>()
            .HasOne<Grade>(s => s.Grade)
            .WithMany(g => g.Students)
            .HasForeignKey(s => s.CurrentGradeId);
превратить во что-то подобное. Это не работает.
C#
1
2
builder.HasOne<Set>()
    .WithMany(w => w.Words);
0
Эксперт .NET
 Аватар для Rius
13084 / 7644 / 1670
Регистрация: 25.05.2015
Сообщений: 23,274
Записей в блоге: 14
03.01.2025, 10:33
Компилится:

Author.cs
C#
1
2
3
4
5
6
7
8
namespace ConsoleApp1;
 
public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Blog> Blogs { get; set; }
}
Blog.cs
C#
1
2
3
4
5
6
7
8
9
namespace ConsoleApp1;
 
public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int AuthorId { get; set; }
    public Author Author { get; set; }
}
AuthorEntityTypeConfiguration.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
 
namespace ConsoleApp1;
 
public class AuthorEntityTypeConfiguration : IEntityTypeConfiguration<Author>
{
    public void Configure(EntityTypeBuilder<Author> builder)
    {
        builder.ToTable("Authors");
        builder.HasKey(a => a.Id);
        builder.Property(a => a.Name).IsRequired().HasMaxLength(100);
    }
}
BlogEntityTypeConfiguration.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
 
namespace ConsoleApp1;
 
public class BlogEntityTypeConfiguration : IEntityTypeConfiguration<Blog>
{
    public void Configure(EntityTypeBuilder<Blog> builder)
    {
        builder.ToTable("Blogs");
        builder.HasKey(b => b.Id);
        builder.Property(b => b.Title).IsRequired().HasMaxLength(200);
        builder.HasOne(b => b.Author)
            .WithMany(a => a.Blogs)
            .HasForeignKey(b => b.AuthorId);
    }
}
Это не работает.
Не компилится или не выполняется?
1
 Аватар для 2033
4 / 4 / 1
Регистрация: 26.12.2024
Сообщений: 225
03.01.2025, 10:38  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Не компилится или не выполняется?
Разобрался, я просто порядок не тот делал, где HasOne и HasMany, поэтому и не мог связать поля.

Добавлено через 33 секунды
Где нужно было сначала писать HasOne я писал HasMany и наоборот
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.01.2025, 10:38
Помогаю со студенческими работами здесь

Нужно создать связь один-ко-многим
Доброго времени суток. Столкнулся с такой проблемой. Нужно создать базу данных гитар. Таблицу Гитары надо связать с таблицами Акустика,...

Не получается создать связь один ко многим
Есть 2 таблицы courier и client. У courier может быть множество строк из client. Получилось только связать один к одному. Как сделать...

Создать две таблицы (продукт, и производитель), и создать между ними связь — один ко многим
Всем привет. Появилась проблема. Нужно создать две таблицы (продукт, и производитель), и создать между ними связь - один ко многим. Ниже...

Создать базу данных с таблицами «Врачи» и «Пациенты» Создать межтабличную связь типа «один-ко-многим»
Ребят выручайте я в таких делах не шарю в универе задали: 1.Создать базу данных с таблицами «Врачи» и «Пациенты» Создать межтабличную...

Создать базу данных с таблицами «Врачи» и «Пациенты» Создать межтабличную связь типа «один-ко-многим»
Ребята запутался в задании, помогите разобраться. Задание Создать базу данных с таблицами «Врачи» и «Пациенты» Создать межтабличную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru