это Entity Framework 6.1.3.Entity Framework - Сделать сгенерированные подписи процедур и функций, не зависящих от EF
Я хочу, чтобы иметь возможность извлекать interface
для моих хранимых процедур. И я хочу, чтобы этот интерфейс не имел никакой зависимости от сборки EntityFramwork.dll, поэтому я могу абстрактно описать его на клиентских слоях, поэтому у них нет поддержки/ссылки/зависимости для Entity Framework.
Проблема в том, что EF ставит классы, подобные ObjectResult
, и ObjectParameter
в созданную подпись метода. И эти классы определены в сборке EntityFramework.dll, поэтому он вводит зависимость на извлеченном интерфейсе, чего я хочу избежать.
Я решил ObjectResult
проблему таким образом: я редактировал файл MyEntities.Context.tt
, и внутри метода public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)
я нашел строку, которая была первоначально это:
returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",
Так что я изменил его на это:
returnType == null ? "int" : "System.Collections.Generic.IEnumerable<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",
Таким образом, тип возврата для сгенерированных процедур больше не ObjectResult<>
, но IEnumerable<>
, что отлично.
Но я не мог решить проблему для корпусов ObjectParameter
. Они генерируются EF, когда у нас есть параметр Output (или параметр InOut). Я хотел бы заменить созданный по умолчанию ObjectParameter myParam
в сигнатуре метода для ref int myParam
, например. И храните ObjectParameter в коде метода, а не в его подписи. Поэтому каждый метод должен создавать внутри ObjectParameter и помещать возвращаемое значение в параметры метода out/ref.
Я старался, но не смог найти способ редактировать MyEntities.Context.tt
таким образом. Возможно, кто-то, кто лучше знает T4 и EF, может представить простое решение ...
Большое спасибо!
Это то, что я сейчас делаю. В настоящее время у меня есть методы-обертки, определенные в частичном файле класса, который «переводит» вызовы на сгенерированные методы EF, когда их исходная подпись не подходит. Проблема заключается в том, что моя БД имеет ровно 2364 процедуры, поэтому это не будет масштабироваться долгое время. Чтобы вручную создать метод обертки для каждого из них, это было бы неосуществимо. Автоматически сгенерированный код - это путь для моего дела. Имеет смысл использовать EF для вызова этих процедур, потому что EF генерирует классы POCO DTO для своих типов возвращаемых данных, которые отлично подходят для моего бизнеса и просмотра слоев. –
2364 SPs? Вау. Это будет проблемой. Удачи с этим. – Steven
Спасибо! Система насчитывает несколько десятилетий ... Есть также тысячи таблиц, триггеров, функций ...Все очень связано с БД. Я пытаюсь омолодить вещи, перенеся все в .NET-архитектуру с использованием EF, переписывая логику из процедур в бизнес-классы, но так легко отделить все SP от SP, так что мне все же приходится называть много их. –