Как исправить «Свойства, чьи типы являются коллекцией примитивов или сложные типы не поддерживаются» с EF DbContext? - PullRequest
1 голос
/ 23 января 2012

У меня есть проект, содержащий объекты 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проекты лица, так как это влияет на ссылки на проекты, которые все еще работают.

1 Ответ

3 голосов
/ 23 января 2012

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 не решит эту проблему.

WCF DS в настоящее время распознает только поставщика 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.

...