Ответ 1
Фактически вы не можете прикрепить поле к типу содержимого. Когда вы присоединяете его к типу контента в пользовательском интерфейсе администратора, Orchard делает некоторые магии за кулисами, чтобы скрыть этот факт от вас - он создает часть содержимого внутри этого типа контента с тем же именем, что и тип содержимого, а затем присоединяет поле к этой новой части содержимого.
Вы можете проверить это, добавив поле через пользовательский интерфейс администратора, а затем перейдя в Импорт/Экспорт и экспортируя метаданные для ваших типов контента.
Чтобы прикрепить поле с помощью миграции, сделайте то же самое. Если у вас нет части контента, которая является подходящим местом для присоединения к полю, я использую соглашение, чтобы создать одно с тем же именем, что и тип содержимого, с ошибкой, дополненной "Частью". Итак, скажем, ваш тип контента - "VideoGame":
ContentDefinitionManager.AlterPartDefinition(
"VideoGamePart"
, b => b
.Attachable()
.WithField("ThumbnailImage", cfg => cfg.OfType("MediaPickerField").WithDisplayName("Video game box cover image"))
);
// Type:
ContentDefinitionManager.AlterTypeDefinition(
"VideoGame"
, cfg =>
cfg
.WithPart("VideoGamePart")
.WithPart("IdentityPart")
.WithPart("TitlePart")
.WithPart("CommonPart")
.Creatable()
);
Все поля привязаны к частям, а не к типам, поэтому вы, естественно, можете управлять размещением с помощью layout.info и шаблонов, используя этот метод миграции, как вы можете, если вы определяете поле через пользовательский интерфейс.