powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли такое, и как ?
10 сообщений из 10, страница 1 из 1
Можно ли такое, и как ?
    #39568306
TsHeloWorlder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите возможно ли такое сделать на EF.

Имеется такая модель данных:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   [Table("my.tab1")]
    public sealed class Tab1Model
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string UKeyField1 { get; set; }

        [Required]
        public string UKeyField2 { get; set; }
    }



я хочу избежать такого кода:

Код: c#
1.
2.
3.
4.
5.
6.
var myModel = context.tab1.SingleOrDefault (x=> x.UKeyField1 == UKeyField1 && x.UKeyField2 == UKeyField2)

var myOtherTab = new OtherTab ()
{
  Tab1 = myModel
}



Можно ли как-то сделать, чтобы работал такой код:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
var myOtherTab = new OtherTab ()
{
  Tab1 = new Tab1Model 
  {
    UKeyField1 = keyField1,
    UKeyField2 = keyField2,
  }
}



Т.е. чтобы EF сам при вставке определял наличие сущности - если ее нет, создавал бы, а если есть - подставлял бы только ссылку на ID.

Думаю, что если объявить модель с составным первичным ключом, то работать будет:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
   [Table("my.tab1")]
    public sealed class Tab1Model
    {
        [Key, Column(Order=0)]
        public string UKeyField1 { get; set; }

        [Key, Column(Order=1)]
        public string UKeyField2 { get; set; }
    }



Но так ключ станет составным и с ним придется существовать (придется выкинуть ID), чего не очень хотелось бы допускать. Сейчас сущность самая по себе уже маленькая. Фактически придется все ее поля делать ключевыми, и тогда практического смысла от самой таблицы практически не будет - разве что ради обеспечения ссылочной целостности и обеспечения действительно уникальности в рамках базы.
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568419
TsHeloWorlder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видимо нельзя )
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568459
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsHeloWorlder,

Дело не в EF, это с точки зрения банальной логики -- полнейшая бессмыслица.
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568494
TsHeloWorlder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Нельзя ли этого сделать через Sql Merge с output параметром на каком нибудь материализованном представлении ? Хочется какой-то оптимизации что ли.
Теоретически наверное можно оптимизировать, если уйти от EF и прийти к процедурам с табличными параметрами.
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568542
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsHeloWorlder,

внятно можете объяснить, чего вы хотите? что значит, EF автоматически должен создавать сущность, если её нет? зачем такая сущность вообще нужна, если она автоматически создаётся? чем заполнить данные её полей? чем вы вообще там занимаетесь?
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568556
TsHeloWorlder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Есть некая сущность Tab1Model. На нее ссылаются другие сущности. Т.е. Tab1Model выступает как некий справочник.
Хотелось бы минимизировать количество обращений к БД. Чтобы при создании сущности OtherTab сразу же создавалась сущность Tab1Model если ее нет в БД, либо заполнялось поле OtherTab.Tab1ModelId, если такая сущность уже есть.

Я могу решить это таким кодом:
Код: c#
1.
2.
3.
4.
5.
6.
var myModel = context.tab1.SingleOrDefault (x=> x.UKeyField1 == UKeyField1 && x.UKeyField2 == UKeyField2)

var myOtherTab = new OtherTab ()
{
  Tab1 = myModel
}



Но тут будет 2 обращения к БД. Вот хотелось бы это оптимизировать.
Это скорее академический интерес, чем практический.
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568579
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsHeloWorlderХотелось бы минимизировать количество обращений к БД.

Загрузите справочник в кеш.


TsHeloWorlderЧтобы при создании сущности OtherTab сразу же создавалась сущность Tab1Model если ее нет в БД, либо заполнялось поле OtherTab.Tab1ModelId, если такая сущность уже есть.

Смотрите, есть ли сущность в кеше, если нет, создавайте.


TsHeloWorlderНо тут будет 2 обращения к БД. Вот хотелось бы это оптимизировать.

Без кеша у вас всегда будет минимум 2 обращения, так как вы не знаете, есть ли запись в справочнике, EF тоже не знает и гадалкой не подрабатывает.
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568581
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsHeloWorlderЭто скорее академический интерес, чем практический.

Академический интерес у меня. Зачем вам создавать запись в справочнике вообще, если вам этот справочник до фанаря?
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568599
TsHeloWorlder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Ну. Простое отношение master-detail.
Tab1Model - master
OtherTab - detail

Соответственно - нужно либо создать master, если его нет. Либо использовать тот, что есть.
...
Рейтинг: 0 / 0
Можно ли такое, и как ?
    #39568834
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsHeloWorlderСоответственно - нужно либо создать master, если его нет. Либо использовать тот, что есть.
Напиши бизнес логику - код сюда который в сервисном слое.
Ведь для него Модель делаем?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли такое, и как ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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