POCO DomainService и Client DomainContext EntityCollections отсутствуют

У меня есть тип MainBusinessLine с ObservableCollection типа Group, и метод, который я вызываю из DomainService, возвращает запрашиваемый список MainBusinessLines. Итак, в этом методе я подтвердил, что все соответствующие группы добавлены в коллекцию групп MainBusinessLines. Но когда сущности загружаются в клиентское приложение Silverlight, почти все они отсутствуют. Но проблема в том, что у MainBusinessLine есть другая коллекция, и она содержит все соответствующие объекты после операции загрузки клиента. И мои атрибуты ассоциации одинаковы, то есть параметры для thisKey и otherKey установлены одинаково.

Я также создаю классы POCO вместо использования EntityFramework. Вот пример моего класса MainBusinessLine:

[Serializable,
DataContract]
public class MainBusinessLine : BaseDataContract
{
    public MainBusinessLine()
    {

    }

    private int _MainBusinessLineID;
    [Key,
    DataMember,
    Required]
    public int MainBusinessLineID
    {
        get
        {
            return _MainBusinessLineID;
        }
        set
        {
            if (_MainBusinessLineID == value)
                return;

            ReportPropertyChanging("MainBusinessLineID");
            _MainBusinessLineID = value;
            ReportPropertyChanged("MainBusinessLineID");
        }
    }

    private ObservableCollection<LOBs> _DefaultLOBs;
    [DataMember,
    XmlIgnore,
    SoapIgnore,
    Include,
    Association("DefaultLOBsCollection", "MainBusinessLineID", "MainBusinessLineID")]
    public ObservableCollection<LOBs> DefaultLOBs
    {
        get
        {
            return _DefaultLOBs;
        }
        set
        {
            ReportPropertyChanging("DefaultLOBs");
            _DefaultLOBs = value;
            ReportPropertyChanged("DefaultLOBs");
        }
    }



    private ObservableCollection<Groups> _Groups;
    [DataMember, 
    Include,
    Association("GroupsCollection", "MainBusinessLineID", "MainBusinessLineID")]
    public ObservableCollection<Groups> Groups
    {
        get
        {
            return _Groups;
        }
        set
        {
            ReportPropertyChanging("Groups");
            _Groups = value;
            ReportPropertyChanged("Groups");
        }
    }
}

А вот классы LOB и Groups:

[Serializable,
DataContract]
public class LOBs : BaseDataContract
{
    private int _LOBID;
    [Key,
    DataMember,
    Required]
    public int LOBID
    {
        get
        {
            return _LOBID;
        }
        set
        {
            if (_LOBID == value)
                return;

            ReportPropertyChanging("LOBID");
            _LOBID = value;
            ReportPropertyChanged("LOBID");
        }
    }

    private int _GroupID;
    [DataMember]
    public int GroupID
    {
        get
        {
            return _GroupID;
        }
        set
        {
            if (_GroupID == value)
                return;

            ReportPropertyChanging("GroupID");
            _GroupID = value;
            ReportPropertyChanged("GroupID");
        }
    }  

    private int _MainBusinessLineID;
    [DataMember]
    public int MainBusinessLineID
    {
        get
        {
            return _MainBusinessLineID;
        }
        set
        {
            if (_MainBusinessLineID == value)
                return;

            ReportPropertyChanging("MainBusinessLineID");
            _MainBusinessLineID = value;
            ReportPropertyChanged("MainBusinessLineID");
        }
    }  
}  

[Serializable,
DataContract]
public class Groups : BaseDataContract
{
    private int _GroupID;
    [Key,
    DataMember,
    Required]
    public int GroupID
    {
        get
        {
            return _GroupID;
        }
        set
        {
            if (_GroupID == value)
                return;

            ReportPropertyChanging("GroupID");
            _GroupID = value;
            ReportPropertyChanged("GroupID");
        }
    }

    private int _MainBusinessLineID;
    [DataMember]
    public int MainBusinessLineID
    {
        get
        {
            return _MainBusinessLineID;
        }
        set
        {  
            if (_MainBusinessLineID == value)  
                return;  

            ReportPropertyChanging("MainBusinessLineID");  
            _MainBusinessLineID = value;  
            ReportPropertyChanged("MainBusinessLineID");  
        }  
    }  
}  

Может кто-нибудь, пожалуйста, скажите мне, что я могу ошибаться здесь? У меня есть ощущение, что это как-то связано с тем, как я устанавливаю атрибуты ассоциации. Спасибо


person jhorton    schedule 09.11.2010    source источник


Ответы (2)


Итак, я наконец понял, что я делаю неправильно. Итак, я собираюсь дать краткое, но подробное объяснение того, как настроить «POCO DomainService». Я уверен, что это не единственный способ, но это самый простой способ, который я нашел, и он работает. И, надеюсь, это избавит кого-то еще от головной боли и разочарований на несколько недель.

Итак, моя ситуация заключалась в том, что у меня был тип MainBusinessLine с коллекцией Groups и коллекцией DefaultLOBs. Но чего я не включил, так это того, что у меня был тип GroupsReference со свойствами MainBusinessLineID и GroupID. Когда я извлек свои данные, я просмотрел типы GroupsReference и добавил группы в коллекцию GroupsCollection родительской MainBusinessLine. И то же самое для DefaultLOBsCollection. Итак, я заполнял коллекцию до того, как они были «запрошены» из DomainService, и возникла проблема.

Подумав об этом и прочитав все, что смог найти, боги кодирования наконец сжалились надо мной и поразили меня ответом. Я бы извлекал данные и создавал списки каждого типа БЕЗ, заполняя любые свойства коллекции, которые являются ассоциациями. А затем верните списки AsQuerable() в соответствующем методе запроса, и сущности, сгенерированные на клиенте, будут иметь полные EntityCollections.

Итак, в заключение, если у вас есть атрибуты Include и Association, установленные с правильными ключами, и вы не пытаетесь форсировать данные, то вы должны добиться успеха. Я включу свой новый пример кода, и, надеюсь, это будет полезно для кого-то еще.

[Serializable,  
DataContract]  
public class MainBusinessLine : BaseDataContract  
{  
    Int32 _MainBusinessLineID;
    [Key,
    DataMember,
    Required]
    public Int32 MainBusinessLineID
    {
        get
        {
            return _MainBusinessLineID;
        }
        set
        {
            if (_MainBusinessLineID == value)
                return;

            _MainBusinessLineID = value;
            ReportPropertyChanged("MainBusinessLineID");
        }
    }

    ObservableCollection<GroupsReference> _GroupsReferenceCollection;
    [DataMember,
    Include,
    Association("GroupsReferenceCollection", "MainBusinessLineID", "MainBusinessLineID")]
    public ObservableCollection<GroupsReference> GroupsReferenceCollection
    {
        get
        {
            return _GroupsReferenceCollection;
        }
        set
        {
            _GroupsReferenceCollection = value;
            ReportPropertyChanged("GroupsReferenceCollection");
        }
    }
}

[Serializable,  
DataContract]  
public class GroupsReference : BaseDataContract
{
    Int32 _GroupsReferenceID;
    [Key,
    DataMember,
    Required]
    public Int32 GroupsReferenceID
    {
        get
        {
            return _GroupsReferenceID;
        }
        set
        {
            if (_GroupsReferenceID == value)
                return;

            _GroupsReferenceID = value;
            ReportPropertyChanged("GroupsReferenceID");
        }
    }

    Int32 _MainBusinessLineID;
    [DataMember,
    Required]
    public Int32 MainBusinessLineID
    {
        get
        {
            return _MainBusinessLineID;
        }
        set
        {
            if (_MainBusinessLineID == value)
                return;

            _MainBusinessLineID = value;
            ReportPropertyChanged("MainBusinessLineID");
        }
    }

    Int32 _GroupID;
    [DataMember,
    Required]
    public Int32 GroupID
    {
        get
        {
            return _GroupID;
        }
        set
        {
            if (_GroupID == value)
                return;

            _GroupID = value;
            ReportPropertyChanged("GroupID");
        }
    }
}  

[Serializable,  
DataContract]  
public class Group : BaseDataContract  
{  
    Int32 _GroupID;
    [Key,
    DataMember,
    Required]
    public Int32 GroupID
    {
        get
        {
            return _GroupID;
        }
        set
        {
            if (_GroupID == value)
                return;

            _GroupID = value;
            ReportPropertyChanged("GroupID");
        }
    }

    ObservableCollection<GroupsReference> _GroupsReferenceCollection;
    [DataMember,
    Include,
    Association("GroupsReferenceCollection", "GroupID", "GroupID")]
    public ObservableCollection<GroupsReference> GroupsReferenceCollection
    {
        get
        {
            return _GroupsReferenceCollection;
        }
        set
        {
            _GroupsReferenceCollection = value;
            ReportPropertyChanged("GroupsReferenceCollection");
        }
    }
}  

[EnableClientAccess(RequiresSecureEndpoint = false)]
public class DentalAdminPortalDomainService : DomainService
{

    public DentalAdminPortalDomainService()
    {
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    }


    [Query]
    public IQueryable<MainBusinessLine> GetMainBusinessLines()
    {
        return DataRepository.GetMainBusinessLines().AsQueryable<MainBusinessLine>();
    }

    [Query]
    public IQueryable<Groups> GetGroups()
    {
        return DataRepository.GetGroups().AsQueryable<Groups>();
    }

    [Query]
    public IQueryable<GroupLOBList> GetGroupsReference()
    {
        return DataRepository.GetGroupsReferences().AsQueryable<GroupsReference>();
    }  
}  

И еще раз, все, что я делаю, это получаю данные из базы данных. Используйте отражение для создания экземпляров каждого типа, установки значений свойств (коллекции не заполняются) и добавления их в список. Затем верните списки клиенту. Все остальное делает сгенерированный код.

person jhorton    schedule 12.11.2010

Будут ли атрибуты XmlIgnore и SoapIgnore вашего ресурса public ObservableCollection<LOBs> DefaultLOBs причиной того, что вы не видите свою коллекцию «MainBusinessLines»?

person Enigmativity    schedule 11.11.2010
comment
Нет, я выяснил причину. У меня есть эти атрибуты, потому что я пробовал разные сценарии. Просто никогда их не снимал. - person jhorton; 12.11.2010