我正在尝试使用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对象数组中人与爱好的联系。
答案 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。