powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Ef + Automapper взаимодействия
7 сообщений из 7, страница 1 из 1
c# Ef + Automapper взаимодействия
    #39498803
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Пытаюсь разобраться во взаимодействии Ef и Automapper. Многие пишут, что используя эти расширения жизнь разработчика становится слаще, вот и я решил разобраться в чем же счастье всего этого.

Создал модель:
Код: 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.
public class Db : DbContext
{
    public Db() : base("ConnectionStringDb") // Соединение с БД
    {
    }
    public DbSet<Book> Book { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new BookMap());
        base.OnModelCreating(modelBuilder);
    }
}
public class Book
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int GlobalId { get; set; }
}
public class BookMap : EntityTypeConfiguration<Book>
{
    public BookMap()
    {
        ToTable("Book", "dbo");
        HasKey(p => p.Id);

        Property(p => p.Id)
            .HasColumnName("Id")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(p => p.Name).HasColumnName("Name");
        Property(p => p.GlobalId).HasColumnName("GlobalId");
    }
}
public class BookDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int GlobalId { get; set; }

    public string GlobalName { get; set; }
}


Создал класс конфигуратора
Код: c#
1.
2.
3.
4.
5.
6.
7.
public static class AutoMapperConfigure
{
     public static void Configure()
     {
         Mapper.Initialize(cfg => cfg.CreateMap<Book, BookDto>());
     }
}


Ну и собственно работа с моделью:
Код: 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.
var db = new Db();
AutoMapperConfigure.Configure();

var listGlobal = new List<BookDto> // Список из другой БД
{
      new BookDto { GlobalId = 1043295, GlobalName = "Гусь" },
      new BookDto { GlobalId = 1040885, GlobalName = "Утка" },
      new BookDto { GlobalId = 1040884, GlobalName = "Курица" }
};

// Совмещаем две позиции
var entity = db.Set<Book>().FirstOrDefault(w => w.GlobalId == 1043295);
var dto = listGlobal.FirstOrDefault(w => w.GlobalId == 1043295);
var dtoEntity = Mapper.Map<Book, BookDto>(entity, dto);

dtoEntity.Name = "Новое имя";  
if (db.ChangeTracker.Entries().Any(w => w.State != EntityState.Unchanged)) 
{
     // Были изменения сущности (СЮДА НЕ ПОПАДАЕТ, при изменении свойства сущности) #1
}
			
// Совмещаем два списка #2
var dtoEntities = db.Set<Book>()
     .Select( s => Mapper.Map<Book, BookDto>(s, listGlobal.FirstOrDefault(w => w.GlobalId == s.GlobalId)))
     .ProjectTo<BookDto>()
     .ToList();



Вопросы и недопонимания:
#1 . Почему не изменяется статус EntityState при изменение свойства сущности?
#2 . Запрос не выполняется когда я пытаюсь выполнить соединение двух списков. Что я делаю не так?

Ну и вообще я правильно вообще использую Automapper, по изложеному коду?
...
Рейтинг: 0 / 0
c# Ef + Automapper взаимодействия
    #39498838
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

Проекции работают ТОЛЬКО ДЛЯ ЧТЕНИЯ. НЕ для изменения. Изменять надо оригинальные модели EF.
...
Рейтинг: 0 / 0
c# Ef + Automapper взаимодействия
    #39498931
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechto,
Проекции работают ТОЛЬКО ДЛЯ ЧТЕНИЯ. НЕ для изменения. Изменять надо оригинальные модели EF.

Выходит, что весь этот automapper нужен только для представления(чтения)? А редактирование как обычно ручками, каждую сущность отдельно?

Со вторым вопросом разобрался, нужно было ToList поставить.
Код: c#
1.
2.
3.
4.
var dtoEntities = db.Set<Book>()
     .ToList()
     .Select( s => Mapper.Map<Book, BookDto>(s, listGlobal.FirstOrDefault(w => w.GlobalId == s.GlobalId)))
     .ToList();
...
Рейтинг: 0 / 0
c# Ef + Automapper взаимодействия
    #39498978
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ на 1 вопрос тоже нашел, путем изменения DTO модели и ForMember. Теперь изменения сущности в Book, учитываются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class BookDto
{
    public Book Book { get; set; }
    public int GlobalId { get; set; }

    public string GlobalName { get; set; }
}



Остался последний для меня не выясненный вопрос. А где нужно инициализировать AutoMapperConfigure.Configure(); Один раз при старте приложения или каждый раз при реализации запроса?
...
Рейтинг: 0 / 0
c# Ef + Automapper взаимодействия
    #39499018
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoВыходит, что весь этот automapper нужен только для представления(чтения)? А редактирование как обычно ручками, каждую сущность отдельно?

Ты не понял. Я говорю про проекции, а не про AutoMapper. Пожалуйста, меняй свою проекцию, но чтобы применить свои измнения, надо с помощью маппера засунуть их обратно в сущности.
...
Рейтинг: 0 / 0
c# Ef + Automapper взаимодействия
    #39499019
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoОстался последний для меня не выясненный вопрос. А где нужно инициализировать AutoMapperConfigure.Configure(); Один раз при старте приложения или каждый раз при реализации запроса?

Один раз при старте приложения.
...
Рейтинг: 0 / 0
c# Ef + Automapper взаимодействия
    #39499040
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttNechtoВыходит, что весь этот automapper нужен только для представления(чтения)? А редактирование как обычно ручками, каждую сущность отдельно?

Ты не понял. Я говорю про проекции, а не про AutoMapper. Пожалуйста, меняй свою проекцию, но чтобы применить свои измнения, надо с помощью маппера засунуть их обратно в сущности.

Уже все понял :)
Спасибо за помощь!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / c# Ef + Automapper взаимодействия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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