1)
https://habrahabr.ru/company/microsoft/blog/101121/Команда EF разъясняет, что Code First – не совсем корректное имя, и его не совсем правильно понимают. Правильнее было бы назвать Modeling using Code. Когда мы описываем модель непосредственно в C# коде, то разработчик код лучше всего понимает. Графический интерфейс Visual Studio теперь будет работать именно с Code First, а edmx более не поддерживается.
Ну т.е. вроде понятно, что использовать в новых проектах.
2) используйте репозиторий:
codereview.stackexchange.com/questions/57401/repos... , только прошу вас, не делайте методов, принимающих Expression и возвращающих IQueryable - такой "репозиторий" совершенно не нужен и никак ничего не абстрагирует, а только вредит. Делайте методы на каждый конкретный тип запроса, принимающие конкретные ограничения для поиска, и возвращающие IEnumerable. Такие методы реально протестировать, и вы не получите дырявую абстракцию, которая будет выдавать вам внезапно ошибки в рантайме при нестандартных запросах на выборку сущностей. И самое главное - вы не будете зависеть от конкретной ORM.
3) не забывайте, что никуда не девался ADO.NET и другие ORM, толстые например NHibernate, и не очень. Если вы в вашем приложении делаете к базе два запроса на вставку (какой-нибудь сервис телеметрии), ни к чему городить огород с ORM. Или если у вас олдскульная база с большим количеством хранимых процедур на сервере, то толстая ORM также ни к чему (какой-нибудь биллинг например).
Если что еще вспомню, напишу.