powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF 4.1 Fluent mapping
14 сообщений из 14, страница 1 из 1
EF 4.1 Fluent mapping
    #37594936
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, уважаемые коллеги!
Пользуясь случаем, Поздравляю Вас с наступающим Новым Годом!

И у меня есть вот такой вопрос:
Итак у нас есть следующие POCO-объекты:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class Team
    {        
        public Team() 
        { 
            Players = new List<Player>(); 
        }
        public long ID { get; set; }
        public string Name { get; set; }
        public List<Player> Players { get; set; }
    }

    public class Player 
    {
        public long ID { get; set; }
        public string Name { get; set; } 
        public string Position { get; set; }
        public long Team_ID { get; set; }
        //public Team Team {get;set;} //вот это мне вообще здесь не нужно!
    }



Настраиваем маппинг, используя Fluent API интерфейс
Код: 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.
public class TeamConfiguration : EntityTypeConfiguration<Team>
    {
        public TeamConfiguration()
        {            
            HasKey(c => c.ID);
            Property(c => c.Name).HasMaxLength(50).IsRequired();
            //HasMany(c => c.Players)
            //    .WithRequired(p => p.Team)
            //    .HasForeignKey(p => p.Team_ID);
            ToTable("Teams");
        }        
    }

    public class PlayerConfiguration : EntityTypeConfiguration<Player> 
    { 
        public PlayerConfiguration() 
        {
            HasKey(c => c.ID);
            Property(c => c.Name).HasMaxLength(50).IsRequired(); 
            Property(c => c.Position).HasMaxLength(50).IsRequired();
            Property(c => c.Team_ID).IsRequired();
            //HasRequired(x => x.Team)
            //    .WithMany(o => o.Players)
            //    .HasForeignKey(ol => ol.Team_ID);
            ToTable("Players");
        } 
    }


Далее создаем свой контекст, согласно примерам из ADO.Net Team
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class MyDbContext : DbContext
    {
        public DbSet<Team> Teams { get; set; }
        public DbSet<Player> Players { get; set; }
        
        public MyDbContext() :
            base("DBConnectionString")
        {
            this.Configuration.LazyLoadingEnabled = true;
            this.Configuration.ProxyCreationEnabled = false;
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {            
            base.OnModelCreating(modelBuilder);

            modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
            modelBuilder.Configurations.Add<Team>(new TeamConfiguration());
            modelBuilder.Configurations.Add<Player>(new PlayerConfiguration());            
        }         
    }



Ну и собственно вопрос
Код: c#
1.
2.
var hc = new MyDbContext();
            Team team = hc.Set<Team>().SingleOrDefault(x => x.ID == 22);



как мне указать маппинг, так чтобы при выполнении вышеуказанного кода
в экземпляре team, загружались элементы коллекции Players?
Спасибо!
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37594983
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37595077
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Using DbContext in EF 4.1 Part 6: Loading Related Entities
Спасибо за ссылку. Но в той статье используется ключевое слово Using DbContext.
Я конечно понимаю что без контекста ни как. Но мне все таки хотелось бы обойтись без
Include(явным вызовом). Можно это программно настроить как в L2S?
что бы контекст при материализации(новое слово освоил), еще и сам лез в БД и
заполнял коллекцию.
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37595134
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочется вот такого простого. как в NHibernate

Код: c#
1.
HasMany(x => x.Players).Table("Players").KeyColumn("Team_ID").Cascade.All(); 
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37595180
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы получил вложенную коллекцию вложенным LINQ-запросом.
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598759
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ бы получил вложенную коллекцию вложенным LINQ-запросом.

Вы бв сделали вот так?:
Код: c#
1.
Team team = hc.Teams.Include(x => x.Players).Where(c => c.ID == 1).Single<Team>();


Получить объект Team и все объекты вложенной коллекции.


Если так, то надо придумать мне как в метод репозитория T GetByID(int id),
передавать список Expression для Include.

Хочется сделать репозиторий, у которого будет метод GetByID и этот метод сам должен подгружать
вложенные объекты в T.

Может кто встречал такую реализацию репозитория?

З.Ы.
Был сильно удивлен. что для того чтобы получить объект и все объекты вложенной коллекции.
EF делает один sql-запрос:
Код: sql
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.
SELECT 
[Project2].[C1] AS [C1], 
[Project2].[ID] AS [ID], 
[Project2].[Name] AS [Name], 
[Project2].[C2] AS [C2], 
[Project2].[ID1] AS [ID1], 
[Project2].[Name1] AS [Name1], 
[Project2].[Position] AS [Position], 
[Project2].[Team_ID] AS [Team_ID]
FROM ( SELECT 
	[Limit1].[ID] AS [ID], 
	[Limit1].[Name] AS [Name], 
	[Limit1].[C1] AS [C1], 
	[Extent2].[ID] AS [ID1], 
	[Extent2].[Name] AS [Name1], 
	[Extent2].[Position] AS [Position], 
	[Extent2].[Team_ID] AS [Team_ID], 
	CASE WHEN ([Extent2].[ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
	FROM   (SELECT TOP (2) 
		[Extent1].[ID] AS [ID], 
		[Extent1].[Name] AS [Name], 
		1 AS [C1]
		FROM [dbo].[Teams] AS [Extent1]
		WHERE 1 = [Extent1].[ID] ) AS [Limit1]
	LEFT OUTER JOIN [dbo].[Players] AS [Extent2] ON [Limit1].[ID] = [Extent2].[Team_ID]
)  AS [Project2]
ORDER BY [Project2].[ID] ASC, [Project2].[C2] ASC



в L2S было бы 3 не больших(простых) запроса.
Это хорошо что к sql-серверу идет один, но большой запрос?
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598825
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXв L2S было бы 3 не больших(простых) запроса.Хорошо ли это?
GFXЭто хорошо что к sql-серверу идет один, но большой запрос?Наверное. Всё зависит от плана выполнения.
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598853
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXВы бв сделали вот так?:
Код: c#
1.
Team team = hc.Teams.Include(x => x.Players).Where(c => c.ID == 1).Single<Team>();


Получить объект Team и все объекты вложенной коллекции.Можно так. Можно и не так. Как больше нравится. :-)
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598888
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КGFXв L2S было бы 3 не больших(простых) запроса.Хорошо ли это?
GFXЭто хорошо что к sql-серверу идет один, но большой запрос?Наверное. Всё зависит от плана выполнения.

1. Думаю что много запросов для того чтобы материализовать бизнес-объект, это все таки плохо... Здесь EF круче чем L2S.
2. А вот план большого запроса, меня более чем устраивает! все джонит через Clustered Index scan
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598896
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КGFXВы бв сделали вот так?:
Код: c#
1.
Team team = hc.Teams.Include(x => x.Players).Where(c => c.ID == 1).Single<Team>();


Получить объект Team и все объекты вложенной коллекции.Можно так. Можно и не так. Как больше нравится. :-)
А как бы Вы сделали? как Вам больше нравится?
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598908
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFX1. Думаю что много запросов для того чтобы материализовать бизнес-объект, это все таки плохо...Я бы не был столь категоричен. Всё зависит от конкретного случая. В большинстве случаев один запрос предпочтительнее, но всяко бывает.
GFXЗдесь EF круче чем L2S.Это да.
GFX2. А вот план большого запроса, меня более чем устраивает! все джонит через Clustered Index scanClustered Index scan - скорее плохо чем хорошо. :-)
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598912
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXА как бы Вы сделали? как Вам больше нравится?Вместо Include сделал бы вложенный запрос. По сути - тоже самое. Но это уже субъективно, чисто дело вкуса.
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37598957
GFX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КClustered Index scan - скорее плохо чем хорошо. :-)

Оказалось что в одном джойне Scan, а во всех случаях seek. А это хорошо :)
У меня еще один вопрос к Вам, какую реализацию Repository посоветуете?
Наверняка, вы EF уже
заюзали в промыленном масштабе, ну и этот момент (с репозиторием) уже прорабатывали :)
Спасибо!

офтоп: Видимо для нового проекта выберу все таки не L2S, а EF 4.1.
...
Рейтинг: 0 / 0
EF 4.1 Fluent mapping
    #37599060
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GFXв L2S было бы 3 не больших(простых) запроса.
Это хорошо что к sql-серверу идет один, но большой запрос?

Хорошо. Межпроцессные (и межмашинные в том числе) вызовы - абсолютное зло. Их количество следует минимизировать.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF 4.1 Fluent mapping
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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