Динамические данные ASP.NET не видят частичные метаданные класса "приятель" - PullRequest
6 голосов
/ 07 января 2012

У меня есть веб-сайт ASP.NET 4 Dynamic Data, который работает с довольно простым набором таблиц базы данных, представленных через модель Entity Framework в другой сборке. Я не хочу создавать все таблиц в модели EF, поэтому в моем файле global.asax я инициализировал модель по умолчанию следующим образом:

DefaultModel.RegisterContext( typeof( MyCompany.MyProject.DataModel.DataContext ), new ContextConfiguration() { ScaffoldAllTables = false } );

В документах MSDN (и комментариях в файле global.asax) говорится, что теперь я должен иметь возможность выборочно включать поддержку отдельных таблиц путем добавления атрибута [ScaffoldTable(true)] к их частичному классу "собеседника". Я сделал это так:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.DynamicData;

namespace MyCompany.MyProject.DataModel
{
    [MetadataType( typeof( InHouseClaimMetadata ) )]
    [ScaffoldTable( true )]
    public partial class InHouseClaim
    {
        [DisplayName( "In-House Claims" )]
        [TableName( "In-House Claims" )]
        public class InHouseClaimMetadata
        {
            [DisplayName( "Reporting Date" )]
            public object ReportingDate { get; set; }

            // etc etc...
        }
    }
}

Но при загрузке Default.aspx я получаю следующее сообщение об ошибке:

Нет доступных таблиц. Убедитесь, что хотя бы одна модель данных зарегистрирован в Global.asax и леса включены или внедрены пользовательские страницы.

Я заставил это работать в подобных сценариях раньше; Единственное, что отличается от этой попытки, это то, что моя модель EF представляет собой собственную сборку. Если я изменю global.asax, чтобы продолжить работу и подготовить все таблицы, все будет работать нормально. Но, очевидно, я этого не хочу. Я тщательно следил за тем, чтобы пространство имен для класса частичных метаданных совпадало с пространством имен контекста данных EF.

Так что я в тупике ...

Ответы [ 3 ]

4 голосов
/ 09 января 2012

Итак, я идиот: это не проблема EF или динамических данных, это ограничение C #. От MSDN :

Все определения частичного типа, предназначенные быть частями одного типа, должны быть определенным в той же сборке и том же модуле (.exe или .dll файл). Частичные определения не могут охватывать несколько модулей.

1 голос
/ 20 апреля 2015

Что мне помогло, так это то, что в Solution Explorer щелкнул правой кнопкой мыши на файле .cs, который содержит мои частичные классы, выбрал Properties и установил Build Action для Compile.По какой-то причине для действия по сборке файла было установлено значение «Контент» по умолчанию.(Мне потребовались часы, чтобы понять это. Надеюсь, это сэкономит кому-то время.)

1 голос
/ 09 января 2012

Я попытался воссоздать ваш сценарий, и вместо использования сопоставления свойств я протестировал с использованием следующего кода:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.DynamicData;

namespace MyCompany.MyProject.DataModel
{
    [MetadataType(typeof(InHouseClaimMetadata))]
    [ScaffoldTable(true)]
    public partial class InHouseClaim
    {
        public class InHouseClaimMetadata
        {

        }
    }
}

Это работает, если пространство имен контекста данных EF совпадаетчто из частичных классов.Можете ли вы попытаться закомментировать ваши сопоставления свойств, чтобы устранить их как проблему, и посмотреть, как вы оттуда идете?

...