Как исправить "Свойства, типы которых являются коллекцией примитивов или сложные типы не поддерживаются" с EF DbContext?

У меня есть проект, содержащий объекты POCO. Для нее был создан контекст базы данных с использованием Entity Framework 4.2 и кода в первую очередь. Это работает нормально, но контекст должен быть представлен как служба OData, которая не работает.

Просмотр к службе OData дает эту ошибку:

Свойство DataSubmissionItems для типа "Lifecycle.ProgramReportSubmission.Model.ProgramReportSubmission" не является допустимым свойством. Свойства, типы которых являются коллекцией примитивов или сложных типов, не поддерживаются.

Класс обслуживания данных выглядит так:

public class ExceptionReportDataService : DataService<ExceptionReportEntitiesContext>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        config.UseVerboseErrors = true;
    }
}

Контекстный класс EF выглядит так:

public class ExceptionReportEntitiesContext : DbContext
{
    public DbSet<ExceptionReport> ExceptionReports { get; set; }

    public ExceptionReportEntitiesContext()
        : base(DynamicConfig.GetAppSettingValue("DB_CONN_STRING_LIFECYCLE"))
    {
    }
}

POCO объекты выглядят так:

namespace WBRT.ProgramData.Lifecycle.ExceptionReportModel
{
    public class ExceptionReport
    {
        public virtual Guid ExceptionReportID { get; set; }
        public virtual Lifecycle.ProgramReportSubmission.Model.ProgramReportSubmission ReportSubmission { get; set; }       
    }
}

namespace Lifecycle.ProgramReportSubmission.Model
{           
    public class ProgramReportSubmission
    {
        public Guid ProgramReportSubmissionId { get; set; }
        public virtual ICollection<DataSubmissionItem> DataSubmissionItems { get; set; }
    }

    public class DataSubmissionItem
    {
        public Guid DataSubmissionItemId { get; set; }
    }
}

Что я пробовал:

  • настройка DataServiceKey в классе DataSubmissionItem
  • настройка ProxyCreationEnabled значение false в конструкторе ExceptionReportEntitiesContext, а также в службе данных
  • Переопределение OnModelCreating и удаление IncludeMetadataConvention
  • Переопределение OnModelCreating и настройка modelBuilder.Entity<ProgramReportSubmission.Model.ProgramReportSubmission>().Ignore(prs => prs.DataSubmissionItems);

Примечание. Я не могу представить зависимость от DLL-файла EntityFramework в проекте объектов POCO, поскольку это влияет на ссылки на проекты, в которых все еще выполняется.NET 3.5.

Кто-нибудь знает, как решить эту ошибку?

1 ответ

Решение

RTM-версия WCF DS не поддерживает такого рода свойства. Но последняя ОСАГО делает. http://blogs.msdn.com/b/astoriateam/archive/2011/10/13/announcing-wcf-data-services-oct-2011-ctp-for-net-4-and-silverlight-4.aspx.

С другой стороны, тот факт, что вы получаете такую ​​ошибку, вероятно, означает, что WCF DS не распознает поставщика как EF, и istead работает с ним как с поставщиком отражения. Так что даже последний CTP не решит эту проблему.

DS WCF в настоящее время распознает только поставщика EF, если T в DataService имеет ObjectContext или производный тип. Типичный обходной путь для EF Code First - определить службу как DataService, а затем переопределить для нее метод CreateDataSource и вернуть реализацию ObjectContext из вашего DbContext. Прочтите эту статью о том, как это сделать (это касается EF 4.1, но я думаю, что то же самое относится и к 4.2): http://social.technet.microsoft.com/wiki/contents/articles/5234.aspx. Вы можете перейти к части о WCF DS.

Другие вопросы по тегам