powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework 6 foreign key в двух таблицах
8 сообщений из 8, страница 1 из 1
Entity Framework 6 foreign key в двух таблицах
    #40124112
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, мне необходимо получить структуру из 3-х таблиц

EntityMain
ID-идентификатор записи
-Entity2ForeignKey- ссылка на идентификатор записи в таблице Entity2, если записи нет, то NULL
-Entity3ForeignKey- ссылка на идентификатор записи в таблице Entity3, если записи нет, то NULL

Entity2
-ID-идентификатор записи
-EntityMainForeignKey- ссылка на ID в таблице EntityMain- может быть NULL, если нет соответствующей записи

Entity3
-ID-идентификатор записи
-EntityMainForeignKey- ссылка на ID в таблице EntityMain- может быть NULL, если нет соответствующей записи

В качестве ORM использую последний EF Core.
Классы сущностей:
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
public  class EntityMain
{
    public int ID { get; set; }

    /// <summary>
    /// Внешний ключ для Entity2
    /// </summary>
    public int Entity2ForeignKey { get; set; }
    public Entity2? Entity2 { get; set; }

    /// <summary>
    /// Внешний ключ для Entity3
    /// </summary>
    public int Entity3ForeignKey { get; set; }
    public Entity3? Entity3 { get; set; }
}

public class Entity2
{
    public int ID { get; set; }

    public int EntityMainForeignKey { get; set; }
    public EntityMain EntityMain { get; set; }
}

public class Entity3
{
    public int ID { get; set; }

    public int EntityMainForeignKey { get; set; }
    public EntityMain EntityMain { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
        builder.Entity<EntityMain>()
            .ToTable("EntityMain")
            .HasOne(p => p.Entity2)
            .WithOne(i => i.EntityMain)
            .HasForeignKey<Entity2>(p => p.EntityMainForeignKey);

            builder.Entity<EntityMain>()
             .ToTable("EntityMain")
             .HasOne(p => p.Entity3)
             .WithOne(i => i.EntityMain)
             .HasForeignKey<Entity3>(p => p.EntityMainForeignKey);

            builder.Entity<Entity2>()
            .ToTable("Entity2")
            .HasOne(p => p.EntityMain)
            .WithOne(i => i.Entity2)
            .HasForeignKey<EntityMain>(f => f.Entity2ForeignKey);

            builder.Entity<Entity3>()
            .ToTable("Entity3")
            .HasOne(p => p.EntityMain)
            .WithOne(i => i.Entity3)
            .HasForeignKey<EntityMain>(f => f.Entity2ForeignKey);

            base.OnModelCreating(builder);
}


Отношения EntityMain->Entity2 и EntityMain->Entity3 один к одному.
Сначала всегда создается сущность Entity2 или Entity3, а потом EntityMain, то есть при создании записи EntityMain всегда для неё есть или Entity2 или Entity3.
Добавление записи:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public async Task AddEntity2(int entity2Id)
    {
        var entity2 = await _context.Entity2.FindAsync(entity2Id);
        if (entity2 is null)
            throw Exception($"Не найдена Entity2 c id:{entity2Id}");

        var entityMain = newEntityMain;
        entityMain.Entity2 = entity2;

        _context.EntityMain.Add(entityMain);
        await _context.SaveChangesAsync();
    }


Проблема в том, что в при добавлении записи EntityMain в таблицах Entity2 и Entity3 поле EntityMainForeignKey остается NULL, в таблице EntityMain поле Entity2ForeignKey или Entity3ForeignKey проставляется.
Я пробовал следующие варианты:
вместо find использовать FirstOrDefault c include
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    public async Task AddEntity2(int entity2Id)
    {
        var entity2 = await _context.Entity2.Include(f=>f.EntityMain).FirstOrDefaultAsync(f=>f.ID==entity2Id);
        if (entity2 is null)
            throw Exception($"Не найдена Entity2 c id:{entity2Id}");

        var entityMain = newEntityMain;
        entityMain.Entity2 = entity2;

         entity2.EntityMain=entityMain; 
        _context.EntityMain.Add(entityMain);
        await _context.SaveChangesAsync();
    }


Все равно не помогает.
Сразу скажу в ответ на то, что можно записи связать и по одному foreignKey и незачем их дублировать в двух таблицах. Да это так, но вышеописанная структура более оптимальна для требуемых sql-запросов-то есть можно избежать join таблиц и вместо 2-х запросить 1, так как в ней уже все данные есть.
Каким образом можно заставить EF Core, чтобы ставилось сразу 2 foreignKey? Спасибо
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40124148
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за хрень. Ты сделал денормализацию и теперь испытываешь ожидаемые проблемы с консистентностью.
Тут очень сильно попахивает преждевременной оптимизацией.
Какая именно у тебя проблема с производительностью? Почему ты решил, что JOIN настолько просадит тебе производительность, что будет оправдан весь этот геморрой? У тебя миллиард записей?
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40124149
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Entity Framework 6
vb_sub
использую последний EF Core.
да и вообще, определись, с чем ты работаешь
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40124162
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Что за хрень. Ты сделал денормализацию и теперь испытываешь ожидаемые проблемы с консистентностью.
Тут очень сильно попахивает преждевременной оптимизацией.
Какая именно у тебя проблема с производительностью? Почему ты решил, что JOIN настолько просадит тебе производительность, что будет оправдан весь этот геморрой? У тебя миллиард записей?


Денормализовать решил из-за того, что Entity2 и Entity3 процентов на 60 имеют общий набор данных, остальные 40-разный. Поэтому общие поля решил вывести в EntityMain, остальные раскидать по другим сущностям. Можно было бы воспользоваться другой крайностью - создать одну Entity, которые включает в себя все возможные свойства и Entity2 и Entity3. Тогда в базе данных строка данных выглядела бы более-менее, но в доменный класс Entity по моему выглядел бы плохо- пришлось бы занулять отсутствующие свойства.
Мне и текущий вариант с деморализацией не очень нравится, но нормализованный не нравится еще больше.
Shocker.ProТут очень сильно попахивает преждевременной оптимизацией
Тяжеловато ощутить грань, где ты думаешь, что просто стараешься делать хороший дизайн, а на самом деле уже преждевременно оптимизируешь.
Shocker.ProПочему ты решил, что JOIN настолько просадит тебе производительность, что будет оправдан весь этот геморрой?
Без нагрузочных тестов я не могу точно сказать на каком количестве записей начнутся проблемы с производительностью, я исхожу из того, что поиск по одной таблице будет быстрее, чем поиск по той же таблице+join с другой таблицей.
Плохо то, что для текущей ситуации я вижу 2 варианта- все в одной таблице и одна Entity, но тогда она будет sparse-то есть в ней будет много null column и доменная модель будет соответствующей или же как описанный мной вариант. Я к сожалению третий вариант не вижу на данный момент.
Хотелось бы узнать как Вы поступаете конкретно в случае когда есть две Entity, которые преимущественно имеют общие поля?
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40124163
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
На данный момент Microsoft.EntityFrameworkCore 6.0.1.
Какую версию посоветуете использовать EntityFrameworkCore 6.0.1 или EF6 для нового проекта?
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40124174
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
я исхожу из того, что поиск по одной таблице будет быстрее, чем поиск по той же таблице+join с другой таблицей.
Это зависит от... не факт, в общем
vb_sub
Хотелось бы узнать как Вы поступаете конкретно в случае когда есть две Entity, которые преимущественно имеют общие поля?
Обычная связь 1:1
vb_sub
На данный момент Microsoft.EntityFrameworkCore 6.0.1.
Какую версию посоветуете использовать EntityFrameworkCore 6.0.1 или EF6 для нового проекта?
EF6 - это последняя версия под .NET Framework. Если работаешь с Core, теперь, когда EFCore тоже достигла версии 6, надо не забывать указывать "Core"
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40124374
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Обычная связь 1:1


+
...
Рейтинг: 0 / 0
Entity Framework 6 foreign key в двух таблицах
    #40125675
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На а по сабжу то есть вариант, как сделать чтобы ключ в двух таблицах проставлялся?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework 6 foreign key в двух таблицах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (10): Анонимы (8), Yandex Bot, Bing Bot 1 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]