Архитектура S # harp, сопоставляющая многих со многими, и службы данных ado.net: единый ресурс ожидался для результата, но было найдено несколько ресурсов - PullRequest
0 голосов
/ 04 декабря 2009

Я разрабатываю приложение, которое считывает данные из базы данных сервера SQL (перенесенной из устаревшей БД) с архитектурой nHibernate и s # arp через службы данных ADO.NET. Я пытаюсь отобразить отношения многие ко многим. У меня есть Класс ошибки:

public class Error
{
    public virtual int ERROR_ID { get; set; }
    public virtual string ERROR_CODE { get; set; }
    public virtual string DESCRIPTION { get; set; }

    public virtual IList<ErrorGroup> GROUPS { get; protected set; }
}

И тогда у меня есть класс группы ошибок:

public class ErrorGroup
{
    public virtual int ERROR_GROUP_ID {get; set;}
    public virtual string ERROR_GROUP_NAME { get; set; }
    public virtual string DESCRIPTION { get; set; }

    public virtual IList<Error> ERRORS { get; protected set; }
}

И переопределения:

public class ErrorGroupOverride : IAutoMappingOverride<ErrorGroup>
{
    public void Override(AutoMapping<ErrorGroup> mapping)
    {
        mapping.Table("ERROR_GROUP");
        mapping.Id(x => x.ERROR_GROUP_ID, "ERROR_GROUP_ID");
        mapping.IgnoreProperty(x => x.Id);
        mapping.HasManyToMany<Error>(x => x.Error)
            .Table("ERROR_GROUP_LINK")
            .ParentKeyColumn("ERROR_GROUP_ID")
            .ChildKeyColumn("ERROR_ID").Inverse().AsBag();
    }
}

public class ErrorOverride : IAutoMappingOverride<Error>
{
    public void Override(AutoMapping<Error> mapping)
    {
        mapping.Table("ERROR");
        mapping.Id(x => x.ERROR_ID, "ERROR_ID");
        mapping.IgnoreProperty(x => x.Id);
        mapping.HasManyToMany<ErrorGroup>(x => x.GROUPS)
            .Table("ERROR_GROUP_LINK")
            .ParentKeyColumn("ERROR_ID")
            .ChildKeyColumn("ERROR_GROUP_ID").AsBag();
    }
}

Когда я просматриваю сервис данных в браузере, как: http://localhost:1905/DataService.svc/Errors, он показывает список ошибок без проблем, и использование его как http://localhost:1905/DataService.svc/Errors(123) тоже работает.

Проблема Когда я хочу увидеть ошибки в группе или группы образуют ошибку, например: "http://localhost:1905/DataService.svc/Errors(123)?$expand=GROUPS" Я получаю XML-документ, но браузер говорит:

The XML page cannot be displayed 
Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later. 
--------------------------------------------------------------------------------
Only one top level element is allowed in an XML document. Error processing resource 'http://localhost:1905/DataServic...
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
-^

Я просматриваю исходный код, а Я получаю данные . Однако это за исключением:

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code></code>
  <message xml:lang="en-US">An error occurred while processing this request.</message>
  <innererror xmlns="xmlns">
    <message>A single resource was expected for the result, but multiple resources were found.</message>

    <type>System.InvalidOperationException</type>
    <stacktrace>   at System.Data.Services.Serializers.Serializer.WriteRequest(IEnumerator queryResults, Boolean hasMoved)&#xD;
   at System.Data.Services.ResponseBodyWriter.Write(Stream stream)</stacktrace>
  </innererror>
</error>

А я что-то упустил ??? Откуда эта ошибка?

Ответы [ 2 ]

0 голосов
/ 20 мая 2010

Я думаю, что это произошло из-за ошибки в linq и nHibernate, сработало после того, как я ограничил результаты только одним.

0 голосов
/ 30 декабря 2009

хмм ... не знаком с этой ошибкой, но мне интересно, имеет ли она какое-то отношение к отложенной загрузке. Ваше текущее сопоставление вызовет запрос дочерней коллекции при обращении к ней, что может привести к срыву сериализации. Сериализация прокси-объектов NHibernate - огромная боль в заднице, полной вуду. Попробуйте изменить свое сопоставление, как в примере ниже, и посмотрите, позволяет ли оно вам продолжить.

public class ErrorOverride : IAutoMappingOverride<Error>
{
    public void Override(AutoMapping<Error> mapping)
    {
        mapping.Table("ERROR");
        mapping.Id(x => x.ERROR_ID, "ERROR_ID");
        mapping.IgnoreProperty(x => x.Id);
        mapping.HasManyToMany<ErrorGroup>(x => x.GROUPS)
            .Table("ERROR_GROUP_LINK")
            .ParentKeyColumn("ERROR_ID")
            .ChildKeyColumn("ERROR_GROUP_ID").Not.Lazy().AsBag();
    }
}
...