metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-02-11 12:01 am

О настоящем вуду.или Entity Framework

После запуска LINQ-To-Entities с Firebird ADO.NET провайдером поневоле согласишся с [livejournal.com profile] theiced, что дотнет делает толпа чертовых индусов под руководством упоротых менеджеров и аутичных хаскелистов.
Во-первых, чтобы EF заработал, нужно сгенерировать файлы маппинга, коих, внезапно 4 штуки: dbname.csdl,dbname.msl,dbname.ssql и dbname.ObjectLayer.cs
Во-вторых, чтобы их сгенерировать - нужно чтобы EdmGen.exe увидел провайдер, что само по себе вуду, с инсталляцией в GAC, регистрацией провайдера руками в machine.config (не работает в итоге) и дальнейшим прописыванием его явно в EdmGem.exe.config
В-третьих, чтобы к полученному бреду подключится, нужно указать строку коннекта для EntityConnection, в виде:
metadata=res://*/DBLINQTests.Resources.dbname.csdl|res://*/DBLINQTests.Resources.dbname.ssdl|res://*/DBLINQTests.Resources.dbname.msl;provider=FirebirdSql.Data.FirebirdClient;provider connection string='data source=fb;initial catalog=dbname;port number=3050;user id=SOMEUSER;password=SOMEPASS;charset=WIN1251'

Т.е. это одна строка коннекта- от ADO.NET провайдера, внутри другой - от Entity Framework, причем строка коннекта должна быть в одинарных кавычках :)

В-четвертых, генерируемый SQL выглядит душераздирающе:
SELECT 
1 AS "C1", 
"GroupBy1"."K1" AS "Document", 
"GroupBy1"."A1" AS "C2"
FROM ( SELECT 
    "Filter1"."K1" AS "K1", 
    COUNT("Filter1"."A1") AS "A1"
    FROM ( SELECT 
        "Extent1"."Document" AS "K1", 
        CAST(1 AS SMALLINT) AS "A1"
        FROM "Cells" AS "Extent1"
        WHERE "Extent1"."Document" < 1000
    )  AS "Filter1"
    GROUP BY "K1"
)  AS "GroupBy1"

Так и запишем: трансформацию не осилили.


В пятых: документации внятной нет. Блогпосты, баг-репорты в трекере Firebird и тому подобный неадекват.

[identity profile] gds.livejournal.com 2012-02-10 09:10 pm (UTC)(link)
вывод, касающийся хранимых процедур: надо лепить около-императивный dsl, поддерживающий на первых этапах как минимум типизацию и некую кроссбазовость, с возможностью вставлять произвольный sql для запросов где надо (это важно для гибкости, но можно вдобавок сделать функцию, преобразовывающую linq-подобную штуку в sql, со всеми её достоинствами и недостатками). но такой дсл, который можно было бы скомпилировать поверх ддл схемы, а не поверх рабочей бд, так как на момент компиляции не всегда есть собственно бд (как по соображениям тех.процесса, так и по соображениям безопасности).

[identity profile] madeveloper.livejournal.com 2012-02-10 09:15 pm (UTC)(link)
NHibernate религия пользовать не позволяет?

[identity profile] stdray.livejournal.com 2012-02-10 10:06 pm (UTC)(link)
Такого ада не встречал. Попробую утром Firebird.

>генерируемый SQL выглядит душераздирающе

Как будто когда-то ЛинкТуСиквел как-то иначе выглядел.

[identity profile] d-e-n-o-m.livejournal.com 2012-02-10 10:11 pm (UTC)(link)
Есть еще bltoolkit. Правда он тоже firebird првайдер использует. Классы по базе генерить умеет. Интересно а рубишный для тулкит как с fb работает?

[identity profile] http://users.livejournal.com/_valerka_/ 2012-02-11 09:48 am (UTC)(link)
Ага, гадость, потом отладить это дело ещё то занятие будет..

[identity profile] norguhtar.livejournal.com 2012-02-12 03:26 am (UTC)(link)
Гагага. Замечу что в JPA такой херни нет ;)