POCO DomainService и Клиент DomainContext EntityCollections отсутствуют объекты - PullRequest
1 голос
/ 09 ноября 2010

У меня есть тип 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");
        }
    }
}

А вот классы LOBs и 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");  
        }  
    }  
}  

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

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

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

В общем, моя ситуация состояла в том, что у меня был тип MainBusinessLine, у которого была коллекция Groups и коллекция DefaultLOBs.Но то, что я не включил, было то, что у меня был тип GroupsReference, который имел свойство MainBusinessLineID и свойство GroupID.Когда я извлек свои данные, я пошел дальше и прошел по типам GroupsReference и добавил группы к родительской группе 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>();
    }  
}  

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

0 голосов
/ 11 ноября 2010

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

...