1

我有一个带有 Group 类型 ObservableCollection 的 MainBusinessLine 类型,我从 DomainService 调用的方法返回 MainBusinessLines 的可查询列表。因此,在此方法中,我已确认所有适当的组都已添加到 MainBusinessLines 组集合中。但是,当实体加载到客户端 silverlight 应用程序中时,几乎所有实体都丢失了。但更重要的是 MainBusinessLine 有另一个集合,它确实包含客户端加载操作后的所有适当实体。而我的 Association Attributes 也是一样的,也就是说 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");  
        }  
    }  
}  

有人可以告诉我我在这里可能有什么问题吗?我觉得这与我设置关联属性的方式有关。谢谢

4

2 回答 2

1

好的,所以我终于弄清楚我做错了什么。因此,我将简要而详细地解释如何设置“POCO DomainService”。我敢肯定这不是唯一的方法,但它是我找到的最简单的方法,并且有效。希望这可以为其他人节省数周的头痛和挫败感。

所以基本上,我的情况是我有一个 MainBusinessLine 类型,它有一个 Groups 集合和一个 DefaultLOBs 集合。但我没有包括的是我有一个 GroupsReference 类型,它有一个 MainBusinessLineID 属性和一个 GroupID 属性。当我检索我的数据时,我继续遍历 GroupsReference 类型并将 Groups 添加到父 MainBusinessLine 的 GroupsCollection。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>();
    }  
}  

再一次,我所做的就是从数据库中获取数据。使用反射创建每种类型的实例,设置属性值(不填充集合),并将它们添加到列表中。然后将列表返回给客户端。其余的全部由生成的代码完成。

于 2010-11-12T15:02:52.877 回答
0

您的财产上的XmlIgnoreSoapIgnore属性public ObservableCollection<LOBs> DefaultLOBs会是您没有看到“MainBusinessLines”集合的原因吗?

于 2010-11-11T06:48:15.700 回答