OData / WCF数据服务不使用复杂类型

时间:2011-08-10 23:43:41

标签: wcf odata wcf-data-services vwdexpress

我是OData和WCF数据服务的新手,所以这可能是一个简单的问题。我正在使用VS Web Developer Express 2010,我在控制台应用程序中托管了一个非常简单的WCF数据服务。它从一个存储库(位于一个单独的dll项目中)返回一个简单的“Study”类的IQuerable集合,后者又从另一个dll中的db项目中检索“Study”类(因此解决方案中有3个项目)。

我在db项目中也有一个'Experiment'类,并且在一个研究中可以有多个实验。当我从研究中排除实验课时,一切正常,我得到了数据。将List集合添加到Study类时会出现问题,然后在尝试运行服务时出现运行时错误。在Firebug中,错误是“500内部服务器错误”,浏览器中的消息是“请求错误”。服务器遇到处理请求的错误。有关详细信息,请参阅服务器日志。'

我有IIS 7,我也刚刚安装了IIS 7.5,但它对我来说是全新的,所以我无法弄清楚托管服务的位置或查看服务器/网络日志的位置。在'C:\ inetpub \ logs \ LogFiles \ W3SVC1'中只能看到IIS 7日志。当我运行应用程序时,VS Web服务器(Cassini)无法启动,因此这表明它是在IIS 7.5(?)中托管的。

因此
  - 如何返回子类/复杂对象?
  - 我如何知道托管服务的位置以及在哪里可以找到服务器日志?

这是主机应用:

using MyStudyRepository;
using MyStudyDB;

namespace MyStudyService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string serviceAddress = "http://localhost:998";
            Uri[] uriArray = { new Uri(serviceAddress) };
            Type serviceType = typeof(StudyDataService);

            using (var host = new DataServiceHost(serviceType,uriArray))
            {
                host.Open();
                Console.WriteLine("Press any key to stop service");
                Console.ReadKey();
            }
        }
    }

    public class StudyDataService : DataService<StudyRepository>
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        }
    }
}

这是存储库:

using MyStudyDB;

namespace MyStudyRepository
{
    public class StudyRepository
    {
        List<Study> _List = new List<Study>();

        //Add constructor to populate myStudies list on creation of class
        public StudyRepository()
        {
            for (int i = 1; i < 5; i++)
            {
                Study myStudy = new Study() { ID = i, StudyOwnerId = i, StudyName = "Study" + i.ToString() /*, Experiments = null */ };
                _List.Add(myStudy);
            }
        }

        public IQueryable<Study> Studies
        {
            get
            {
                return _List.AsQueryable<Study>();
            }
        }
    }
}

这是DB:

namespace MyStudyDB
{
    public class Study
    {
        public int ID { get; set;}
        public int StudyOwnerId { get; set; }
        public string StudyName { get; set; }
        //public List<Experiment> Experiments { get; set; }
    }

    public class Experiment
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int StudyId { get; set; }
    }
}

2 个答案:

答案 0 :(得分:5)

要调试WCF数据服务,请参阅此博文:http://blogs.msdn.com/b/phaniraj/archive/2008/06/18/debugging-ado-net-data-services.aspx 至于为什么实验集合不起作用,有两个原因:

  • 实验类未被识别为实体类型,因为没有为其设置实体。 (实体集是您的存储库类上的IQueryable属性,您没有)。因此,Experiment类仅被识别为复杂类型。
  • 当前发布的WCF数据服务版本不支持MultiValues,MultiValue实际上是原始或复杂类型的集合。

所以你有两种方法可以“解决”这个问题。通过在存储库类中添加IQueryable属性,确保Experiment实际上是一个实体。 或使用最新的CTP(http://blogs.msdn.com/b/astoriateam/archive/2011/06/30/announcing-wcf-data-services-june-2011-ctp-for-net4-amp-sl4。 aspx)支持MultiValues。

答案 1 :(得分:1)

谢谢!我猜它缺少类的DataServiceKey属性,如下所示:

[DataServiceKey("ID")]
public class Study
{ 
    .....
}