这是我的设置:我有一些“数据”,它实际上是一个对象图(代表SSAS对象的DTO),我希望通过RIA服务进行序列化和发送,以供Silverlight应用程序使用。这是一个简单的例子:
public class Database
{
[Key]
public int ID { get; set;}
public string Name { get; set;}
[Include]
[Association("DatabaseCue", "ID", "DatabaseID"]
public IEnumerable<Cube> Cubes { get; set;}
}
public class Cube
{
[Key]
public int ID { get; set;}
public int DatabaseID { get; set;}
public string Name { get; set;}
// other Cube properties
}
我有DomainService
:
[EnableClientAccess()]
public class AmoService : DomainService
{
public IQueryable<Database> GetDatabases()
{
return myAmoAdapter.GetDatabases();
}
}
myAmoAdapter.GetDatabases()
检索数据库集合,也很好地填充其子Cubes集合,但是,在客户端,cube集合是空的!我无法弄清楚如何使这项工作! (或者它可能不会?!)
有人知道为什么这不起作用以及如何解决它?我将不胜感激。
答案 0 :(得分:0)
唯一与我如何做的不同的是公共IEnumerable Cubes {get;组;}。我通常会这样做:
public List<Cube> Cubes { get; set;}
此外,您需要一个Composition标签,如下所示:
[Include]
[Composition]
[Association("DatabaseCue", "ID", "DatabaseID"]
public IEnumerable<Cube> Cubes { get; set;}
答案 1 :(得分:0)
您是否在客户端检查EntitySet
是否为Cube
?
如果没有,那么您还需要告诉RIA服务Cube
是应该在客户端上生成的类。您可以通过在服务器端定义这样的虚拟方法来实现此目的:
public IQueryable<Cube> GetCubesDummy()
{
return new List<Cube>().AsQueryable();
}
如果EntitySet
存在,您还应该检查外键是否正常。仅仅因为集合已填充在服务器上,并不意味着DatabaseID
元素中的Cube
是正确的。
答案 2 :(得分:0)
您可以在IsForeignKey
对象上显式设置Association
属性的Database
属性
[Include]
[Association("DatabaseCue", "ID", "DatabaseID", IsForeignKey = false]
public IEnumerable<Cube> Cubes { get; set;}
答案 3 :(得分:0)
您可能想要尝试的一件事是在构造函数中初始化Database上的Cubes集合。
public class Database
{
public Database
{
Cubes = new List<Cube>();
}
[Key]
public int ID { get; set;}
public string Name { get; set;}
[Include]
[Association("DatabaseCue", "ID", "DatabaseID"]
public IEnumerable<Cube> Cubes { get; set;}
}
如果未初始化关联实体集合,RIA服务有时会出现一些奇怪的行为。
答案 4 :(得分:0)
我遇到了类似的问题,结果证明如果我将孩子添加到父母的集合中并且还专门设置父ID,它会起作用。
所以
Database db = ...
db.Cubes.Add(new Cube(){ID=1, DatabaseID=db.ID, Name = "Cube1" });
如果我没有DatabaseID = db.ID,它们将被设置为零,RIA Services不会返回任何内容。错误?