如何使用Silverlight外部的RIA Services代理客户端中的关联

时间:2012-08-28 16:53:28

标签: wcf wcf-ria-services

我正在尝试使用RIA域服务,就好像它是一个WCF服务(从技术上来说就是这样)

生成的代理客户端似乎存在“缺失”的关键元素。例如关联的对象属性。

为简单起见,这里有两个类的例子:

    public class Person
    {
        [Key]
        public int Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        [Include]
        [Association("Person_Hobbies", "Id", "Person_Id")]
        [Composition]
        public IEnumerable<Hobby> Hobbies { get; set; }

    }

    public class Hobby
    {
        [Key]
        public int Id { get; set; }

        public string Name { get; set; }

        public int Person_Id { get; set; }

    }

在域名服务中,我们可以将人和他们的爱好归还为:

public IQueryable<Person> GetPeople()
        {
            var peopleList = new[] {
                new Person { Id = 1, FirstName = "Fred", LastName = "Flintstone", Hobbies = new List<Hobby>() { new Hobby { Id = 1, Name="Reading",  Person_Id=1 },
                                                                                                                    new Hobby { Id = 2, Name="Biking", Person_Id=1}, }},
                new Person { Id = 2, FirstName = "Barnie", LastName = "Rubble", Hobbies = new List<Hobby>() { new Hobby { Id = 3, Name="Skiing",  Person_Id=2 },
                                                                                                                    new Hobby { Id = 4, Name="Rock Climbing", Person_Id=2} } },
                 };

            return peopleList.AsQueryable<Person>();
        }

我已经在Silverlight和DomainService之间验证了这与预期完全一样。

但是,在引用此RIA域服务的控制台应用程序中,生成的Person类没有Hobbies属性(就像在Silverlight客户端中一样)。

确实,当我打电话给GetPeople时,我得到RootResults(人)和IncludedResults(爱好),我可以将两者“加入”。所以我可以在没有爱好财产的情况下生活

困难在于准备一个ChangeSetEntry数组---如何从控制台应用程序发送一个人和他们的爱好服务?在Silverlight中,我创建了一个新的Person,向Hobbies属性添加了爱好,并将Person添加到DomainContext和SubmitChanges。在幕后RIA Server(无论是在客户端还是服务器上,我都不确定)将其排序。

我正在努力解决ChangeSetEntry对象数组中人与爱好的联系。

1 个答案:

答案 0 :(得分:2)

据我所知,这是预期的行为。关联属性是代码生成器在代理中生成的SL域上下文的“神奇”。 您可以发送一个数组,其中包含1个changesetentry for person和changesetentry,用于该人员拥有的每个爱好。 该数组中的索引很重要。您可以使用它来跟踪关联。填充每个ChangeSetEntry的Associations属性,该属性与此类

之类的关联
Dictionary<string, int> personHobbyAss = new Dictionary<string, int>();
personHobbyAss.Add("Person_Hobbies", 1)

其中1是相关条目的索引。

我同意这不是直截了当且非常有限,但......至少它是有效的。请注意,如果没有“参考”Hobby.Person,我从未尝试像你这样的协会,但只有Fk。