Alex Angas
Alex Angas

Reputation: 60058

How to fix "Properties whose types are collection of primitives or complex types are not supported" with EF DbContext?

I have a project containing POCO entities. A database context has been created for it using Entity Framework 4.2 and code first. This works fine, but the context needs to be exposed as an OData service which does not work.

Browsing to the OData service gives this error:

The property 'DataSubmissionItems' on type 'Lifecycle.ProgramReportSubmission.Model.ProgramReportSubmission' is not a valid property. Properties whose types are collection of primitives or complex types are not supported.

The data service class looks like:

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;
    }
}

The EF context class looks like:

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

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

The POCO entities look like:

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; }
    }
}

What I've tried:

Note: I can't introduce a dependency on the EntityFramework DLL in the POCO entities project as this affects referencing projects that still run .NET 3.5.

Anyone know how to resolve this error?

Upvotes: 1

Views: 2568

Answers (1)

Vitek Karas MSFT
Vitek Karas MSFT

Reputation: 13320

THe RTM version of WCF DS doesn't support these kind of properties. But the latest CTP does. http://blogs.msdn.com/b/astoriateam/archive/2011/10/13/announcing-wcf-data-services-oct-2011-ctp-for-net-4-and-silverlight-4.aspx.

On the other hand, the fact that you get such an error probably means that WCF DS doesn't recognize the provider as EF, and istead works with it as with a reflection provider. So even the latest CTP won't really fix that problem.

WCF DS currently only recognizes EF provider if the T in DataService is ObjectContext or derived type. The typical workaround for EF Code First is to define the service as DataService and then override the CreateDataSource method on it and return the ObjectContext implementation from your DbContext. See this article about how to do that (it's about EF 4.1, but I think the same will apply to 4.2 as well): http://social.technet.microsoft.com/wiki/contents/articles/5234.aspx. You can skip down to the part about WCF DS.

Upvotes: 3

Related Questions