powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Одна сущность используется в двух контекстах. Как выставить свойство ?
24 сообщений из 24, страница 1 из 1
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942212
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.
Есть класс-сущность. Он используется в двух контекстах (один работает с актуальной базой, другой с архивной).
Как в сущность добавить свойство IsArchived и выставить его в зависимости от контекста, в котором сущность ?


Я добавляю свойство bool IsArchived, выставляю ему Ignore.
А вот как, и где, заполнить это свойство ?
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942220
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно в контексте перед сохранением изменений контекста просканировать через ChangeTracker наличие в нем определенных сущностей и выставить им нужный IsArchived.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942226
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Делать что-то типа этого ?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();
 
        foreach (var entry in ChangeTracker.Entries())
        {
            if(entry.State == EntityState.Added || entry.State == EntityState.Modified)
            {
                entry.Property("LastUpdated").CurrentValue = DateTime.UtcNow;
            }
        }
        return base.SaveChanges();
    }



Сложная идея какая-то.
Но почему на SaveChanges ?

Мне то нужно иметь это свойство при считывании данных из бд. Чтобы при обращении к DbSet у сущностей было это свойство заполнено.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942232
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrBitCoin
Но почему на SaveChanges ?
потому что вопрос был не то чтобы однозначным
MrBitCoin
выставить его в зависимости от контекста, в котором сущность


Если про чтение речь идет, посмотри
https://docs.microsoft.com/ru-ru/ef/core/modeling/value-conversions
и соседние темы, можно подобрать что-то наиболее подходящее
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942233
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок. Спасибо.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942235
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не нашел там то, что могло бы помочь.
Там указано как производить конвертирование из одного типа в другой. Как я понимаю, для того, чтобы можно было сериализовать данные в бд.

А мне нужно внутри контекста заполнить игнорируемое поле.
Вы предлагаете использовать метод настройки конвертера, чтобы потом в коде делать примерно так ?
Код: c#
1.
.HasConversion<bool, bool>(x=>x.IsArchived = true, x=>x.IsArchived = true)



выглядит как то не очень...
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942245
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ничего конкретного не предложил, пока занят, некогда копаться, я попытался предложить покопать в сторону модели: для разных контекстов можно сделать разный OnModelCreating и там уже присоединить либо разные конверторы к одной и той же сущности, либо что-то аналогично
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942246
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, я и сам думаю, что это нужно делать в OnModelCreate.
Вот только как, не пойму.

Конвертер, кажется, не подходит. Я написал выше.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942269
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrBitCoin
Конвертер, кажется, не подходит.
почему? Можно же в OnModelCreating задать в modelBuilder.Entity<Rider>().Property(e => e.Mount).HasConversion(converter); разные конвертеры для разных контекстов. Впрочем, тут надо пробовать.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942288
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так а причем тут конвертер ? Конвертер из чего в чего ?

И там и там bool свойство.

Ковертер нужен, как я понимаю, для сериализации в БД. А тут мне нужно из двух разных контекстов просто предзаполнять одно из свойств по разному чуть чуть... Мне кажется тут конвертер вообще никаким боком.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942293
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я и говорю - надо пробовать. Можно ли, например, добавить свойство, которое игнорится при записи в БД, но при этом имеет конвертор.

А что мешает использовать разные сущности в разных контекстах, наследуемые одна от другой?
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942310
MrBitCoin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
я и говорю - надо пробовать. Можно ли, например, добавить свойство, которое игнорится при записи в БД, но при этом имеет конвертор.

А что мешает использовать разные сущности в разных контекстах, наследуемые одна от другой?


А что это меняет ? Проверять потом не свойство а тип объекта ? Можно наверное. Но не уверен, что проверка на тип это красивое решение.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942315
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrBitCoin
А что это меняет ? Проверять потом не свойство а тип объекта ? Можно наверное. Но не уверен, что проверка на тип это красивое решение.
Почему? Зачем? В одном объекте будет true, в другом false - как ты хотел. При этом их можно будет приводит к единому базовому классу.

Правда, тут будут подводные камни, все зависит от того, как ты планируешь использовать результат запроса.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942339
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любые манипуляции со значениями свойств это не задача контекста и вообещ не задача слоя доступа к данным. Делать это там это архитектурная ошибка. Этим должен заниматься слой бизнес-логики.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942345
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, в принципе, если так уж надо, то можно переопределить метод(ы) SaveChanges(Async) - они виртуальные, через ChangeTracker.Entries<>() получить все сущности нужного типа, которые на данный момент в контексте и выставить им нужное значение. Это если я правильно задачу понял.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942346
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Но, в принципе, если так уж надо, то можно переопределить метод(ы) SaveChanges(Async) - они виртуальные, через ChangeTracker.Entries<>() получить все сущности нужного типа, которые на данный момент в контексте и выставить им нужное значение. Это если я правильно задачу понял.
А ты всегда читаешь только первое сообщение?
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942347
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Любые манипуляции со значениями свойств это не задача контекста и вообещ не задача слоя доступа к данным. Делать это там это архитектурная ошибка. Этим должен заниматься слой бизнес-логики.
А вот тут согласен, в принципе... но не стал настаивать, потому что сам грешен )
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942369
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
А ты всегда читаешь только первое сообщение?

Обычно да, если ответ знаю :)) Тут, правда, проверить пришлось немного по референсу - в "старом" EF это, кажется, слегка по-другому делалось, хотя, точно уже и не вспомню.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942720
svpk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно при устанавливать свойство при чтении, то можно добавить обработчик для события контекста ObjectMaterialized.

Что-то типа такого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class DBContext : DbContext
{
    public DBContext()
    {
        ObjectContext objectContext = ((IObjectContextAdapter)this).ObjectContext;

        objectContext.ObjectMaterialized += (s, e) => ObjectMaterialized(s, e);
    }

    private void ObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
    {
        if (e.Entity.GetType().Name == "...") {
            e.Entity.GetType().GetProperty("IsArchived").SetValue(e.Entity, "XXX");
        }
    }
}
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39942723
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем больше работаешь с новым EF, тем больше тоскуешь по старому EF
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39945618
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Чем больше работаешь с новым EF, тем больше тоскуешь по старому EF

>= 6.4.0 уже можно использовать в коровских 3+ приложениях, ибо netstandard 2.1, но, могут быть проблемы с другими пакетами (напр. ASP.NET Identity), которые требуют коре-версию EF.

А что не так с коревским EF? Меня пока что напрягает только отсутствие полноценного many-2-many, и еще на некоторые грабли с миграциями наступал.
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39945633
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
>= 6.4.0 уже можно использовать в коровских 3+ приложениях, ибо netstandard 2.1, но, могут быть проблемы с другими пакетами (напр. ASP.NET Identity), которые требуют коре-версию EF.


Да, это очень хорошая новость для многих :)


fkthat
А что не так с коревским EF? Меня пока что напрягает только отсутствие полноценного many-2-many, и еще на некоторые грабли с миграциями наступал.


Уровень трансляции запросов LINQ в SQL, между 6-м EF и коровским. Разница пара парсеков.
Коровский прям дитя малое. До сих пор. Для примера, перевели кусочек проекта на кору, он вообще больше половины LINQ не обрабатывает, их нужно перетачивать.

При чём посыл вроде верный, EF кор заставляет переносить всю логику из запросов на клиента, агрессивное кеширование, подход с разделением запросов.

В то время, как EF 6 может всё. Просто из коробки может всё :)
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39945653
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Для примера, перевели кусочек проекта на кору, он вообще больше половины LINQ не обрабатывает, их нужно перетачивать.

Наверное, что-то связанное с SqlFunctions или подобным?
...
Рейтинг: 0 / 0
Одна сущность используется в двух контекстах. Как выставить свойство ?
    #39945662
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
hVostt
Для примера, перевели кусочек проекта на кору, он вообще больше половины LINQ не обрабатывает, их нужно перетачивать.

Наверное, что-то связанное с SqlFunctions или подобным?


Группировки, подзапросы, фильтры по подзапросам, expanded выражения и прочее. Ну а SqlFunctions как бы уже вишенка )
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Одна сущность используется в двух контекстах. Как выставить свойство ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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