Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Можно ли такое, и как ? / 10 сообщений из 10, страница 1 из 1
12.12.2017, 13:34
    #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
12.12.2017, 16:04
    #39568419
TsHeloWorlder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое, и как ?
видимо нельзя )
...
Рейтинг: 0 / 0
12.12.2017, 16:40
    #39568459
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое, и как ?
TsHeloWorlder,

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

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

внятно можете объяснить, чего вы хотите? что значит, EF автоматически должен создавать сущность, если её нет? зачем такая сущность вообще нужна, если она автоматически создаётся? чем заполнить данные её полей? чем вы вообще там занимаетесь?
...
Рейтинг: 0 / 0
12.12.2017, 18:08
    #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
12.12.2017, 18:35
    #39568579
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли такое, и как ?
TsHeloWorlderХотелось бы минимизировать количество обращений к БД.

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


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

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


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

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

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

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

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


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