Entity framework “如何修复”;不支持类型为基元集合或复杂类型的属性";使用EF-DbContext?

Entity framework “如何修复”;不支持类型为基元集合或复杂类型的属性";使用EF-DbContext?,entity-framework,wcf-data-services,Entity Framework,Wcf Data Services,我有一个包含POCO实体的项目。已经使用EntityFramework4.2和CodeFirst为其创建了数据库上下文。这很好,但是上下文需要作为OData服务公开,而OData服务不起作用 浏览OData服务时出现以下错误: 类型上的属性“DataSubmissionItems” “Lifecycle.ProgramReportSubmission.Model.ProgramReportSubmission”是 不是有效的属性。类型为的集合的属性 不支持基本类型或复杂类型 数据服务类类似于:

我有一个包含POCO实体的项目。已经使用EntityFramework4.2和CodeFirst为其创建了数据库上下文。这很好,但是上下文需要作为OData服务公开,而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;
    }
}
public class ExceptionReportEntitiesContext : DbContext
{
    public DbSet<ExceptionReport> ExceptionReports { get; set; }

    public ExceptionReportEntitiesContext()
        : base(DynamicConfig.GetAppSettingValue("DB_CONN_STRING_LIFECYCLE"))
    {
    }
}
公共类例外ReportDataService:DataService
{
//此方法只调用一次以初始化服务范围策略。
公共静态void InitializeService(DataServiceConfiguration配置)
{
config.SetEntitySetAccessRule(“*”,EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion=DataServiceProtocolVersion.V2;
config.UseVerboseErrors=true;
}
}
EF上下文类类似于:

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;
    }
}
public class ExceptionReportEntitiesContext : DbContext
{
    public DbSet<ExceptionReport> ExceptionReports { get; set; }

    public ExceptionReportEntitiesContext()
        : base(DynamicConfig.GetAppSettingValue("DB_CONN_STRING_LIFECYCLE"))
    {
    }
}
公共类例外ReportEntityContext:DbContext { 公共数据库集例外报告{get;set;} 公共例外报告实体上下文() :base(DynamicConfig.GetAppSettingValue(“DB\u连接\u字符串\u生命周期”)) { } } 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; }
    }
}
命名空间WBRT.ProgramData.Lifecycle.ExceptionReportModel
{
公共类例外报告
{
公共虚拟Guid例外报告ID{get;set;}
公共虚拟生命周期.ProgramReportSubmission.Model.ProgramReportSubmission报告提交{get;set;}
}
}
命名空间Lifecycle.ProgramReportSubmission.Model
{           
公开课程报告提交
{
公共Guid ProgramReportSubmissionId{get;set;}
公共虚拟ICollection DataSubmissionItems{get;set;}
}
公共类数据子任务
{
公共Guid DataSubMid{get;set;}
}
}
我所尝试的:

  • 在DataSubmissionItem类上设置
    DataServiceKey
  • 在ExceptionReportEntitiesContext构造函数和数据服务中将
    ProxyCreationEnabled
    设置为false
  • 重写模型创建上的
    并删除IncludeMetadata约定
  • 重写建模时的
    和设置
    modelBuilder.Entity().Ignore(prs=>prs.DataSubmissionItems)
注意:我不能在POCO entities项目中引入对EntityFramework DLL的依赖,因为这会影响仍然运行.NET 3.5的引用项目


有人知道如何解决此错误吗?

WCF DS的RTM版本不支持此类属性。但最新的CTP确实

另一方面,您得到这样一个错误的事实可能意味着WCF DS无法将提供程序识别为EF,并且istead将其作为反射提供程序使用。所以即使是最新的CTP也不能真正解决这个问题


WCF DS当前仅在数据服务中的T为ObjectContext或派生类型时识别EF提供程序。EF代码的典型解决方法是首先将服务定义为DataService,然后覆盖其上的CreateDataSource方法,并从DbContext返回ObjectContext实现。请参阅这篇关于如何做到这一点的文章(关于EF4.1,但我认为同样的内容也适用于4.2):。您可以跳到有关WCF DS的部分。

Super!如果该属性是集合,则可以对其进行更改(我将尝试将其更改为HashSet)。我不确定CTP是否是一种选择——我认为它没有“上线”许可证。但是如果你解决了EF提供者的问题,它可能在没有CTP的情况下工作。尝试过,但没有运气。没关系,我们现在将回到使用EDMX。我相信当.NET4.5发布时,你会很高兴的!