Как исправить "Свойства, типы которых являются коллекцией примитивов или сложные типы не поддерживаются" с 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.