Как сделать доступ всех сущностей: внутренним, а не общедоступным в EDMX? - PullRequest
9 голосов
/ 01 марта 2012

Я бы хотел, чтобы моя модель Entity Framework генерировала сущности с internal модификатором доступа вместо public. Я использую модель EF в библиотеке и хочу, чтобы только один класс (некоторый контроллер) был доступен снаружи.

Есть ли какой-нибудь простой способ заставить модель EF использовать модификатор internal вместо public, включая регенерацию модели при обновлении?

Ответы [ 4 ]

3 голосов
/ 01 марта 2012

Конечно, в окне Model Browser выберите> EntityTypes

Model Browser

и выберите тип, указанный в модификаторе доступа к окну Properties.Вы также должны изменить в EntityContainer> EntitySets модификатор для набора, как если бы тип был внутренним, набор должен быть как минимум внутренним (по умолчанию public).

Опционально вы можете использовать шаблон T4, где вы можете напрямуюизменить сгенерированный доступ, сгенерированный.

1 голос
/ 01 марта 2012

Это очень похоже на ответ, который я получил на похожий вопрос .Но в вашем случае вы хотите настроить модификатор доступа классов, а не ObjectContext.

Адаптировано после ответа hvd:

В конструкторе есть опция «Добавить элемент генерации кода».Если вы используете это, вы получите несколько вариантов.Я использую «ADO.NET Self-Tracking Entity Generator», но одинаковый способ работает для всех них.Выбор этого добавляет два файла шаблона (Model.tt и Model.Context.tt) в ваш проект, который вы можете изменять по своему усмотрению.Для модификации, о которой вы спрашиваете, вы найдете генерацию кода для ваших классов сущностей в строке 37 или около нее. Измените

<# = Accessibility.ForType (entity) #> <# =code.SpaceAfter (code.AbstractOption (entity)) #> частичный класс ...

до

частичный класс ...

Для сложного типа ниже есть аналогичная строка: также стереть деталь перед «частичной».

Это установит модификаторы доступа для всех типов одновременно, включая будущие типы.Для настройки отдельных типов лучше использовать браузер модели.

Вам также нужно будет установить свойство «Доступ к контейнеру сущностей» самой модели как внутреннее, иначе будут созданы элементы с несовместимыми модификаторами доступа.

0 голосов
/ 21 сентября 2018

Я только что прошел через эту версию с последней версией Entity Framework (6.2.0). В строке 314 файла .tt я нашел это:

public string EntityClassOpening(EntityType entity)

В строке 319 я просто изменил ее на строку с указанием внутреннего. Запустил инструмент, и теперь все мои сущности являются внутренними.

0 голосов
/ 15 мая 2017

Я хотел, чтобы мой контейнер сущностей, а также сгенерированные сложные классы были внутренними. Сначала я установил внутренний доступ к контейнеру сущностей. Затем я добавил переменную контейнера в начало файла «Model.tt» после инициализации переменной itemCollection. Я нашел код переменной контейнера в файле «Model.Context.tt».

    var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
    var container = itemCollection.OfType<EntityContainer>().FirstOrDefault();

Далее я изменился

    <#=Accessibility.ForType(complex)#> partial class <#=code.Escape(complex)#>

до

    <#=Accessibility.ForType(container)#> partial class <#=code.Escape(complex)#>

Я решил изменить код таким образом, чтобы синхронизировать модификаторы доступа к контейнеру сложного класса с модификатором доступа к контейнеру.

Спасибо Герт Арнольд за ведение меня в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...