2011-03-16 51 views
1

我有一个SL4/WCF RIA服务/ EF 4应用程序。我无法将我的Included实体放入我的SL4数据上下文中。实体框架/ RIA服务包括不工作

在本申请的服务器侧服务部,这是我的方法:

[Query(IsDefault = true)] 
    public IQueryable<ToolingGroup> GetToolingGroups() 
    { 
     var groups = this.ObjectContext.ToolingGroups.Include("MetaData").OrderBy(g => g.Name); 
     return groups; //breakpoint set here 
    } 

我分配它到VAR组,以允许其在方法返回之前进行检查。如果我的方法返回之前设置一个断点,并添加一行到我的收藏窗口中的元数据有:

groups.First().MetaData 

当我让方法的返回,并检查它在Silverlight的用户界面完成事件元数据为空。

void loadOperation_Completed(object sender, System.EventArgs e) 
    { 
     grid.ItemsSource = _toolingContext.ToolingGroups; 
     UpdateUI(); //breakpoint set here 
    } 

当我做这在我的监视窗口元数据是空:

_toolingContext.ToolingGroups.First().MetaData 

我检查,以确保通过调用。首先()在这两种情况下返回ToolingGroup是相同的实体和它是。

为什么元数据在服务方法和我的UI方法之间丢失(例如空)?

SOLUTION:

// The MetadataTypeAttribute identifies ToolingGroupMetadata as the class 
// that carries additional metadata for the ToolingGroup class. 
[MetadataTypeAttribute(typeof(ToolingGroup.ToolingGroupMetadata))] 
public partial class ToolingGroup 
{ 

    // This class allows you to attach custom attributes to properties 
    // of the ToolingGroup class. 
    // 
    // For example, the following marks the Xyz property as a 
    // required property and specifies the format for valid values: 
    // [Required] 
    // [RegularExpression("[A-Z][A-Za-z0-9]*")] 
    // [StringLength(32)] 
    // public string Xyz { get; set; } 
    internal sealed class ToolingGroupMetadata 
    { 

     // Metadata classes are not meant to be instantiated. 
     private ToolingGroupMetadata() 
     { 
     } 

     public int Id { get; set; } 

     [Include] // Added so MetaData gets serialized 
     public MetaData MetaData { get; set; } 

     public Nullable<int> MetaDataId { get; set; } 

     public string Name { get; set; } 

     public ToolingCategory ToolingCategory { get; set; } 

     public int ToolingCategoryId { get; set; } 

     public EntityCollection<ToolingType> ToolingTypes { get; set; } 
    } 
} 

回答

4

有在玩两层这里,EF和RIA服务。你已经处理了EF部分。现在,您需要告诉RIA服务,在它通过线路串行化您的实体时包含该属性。在实体的元数据中,添加[Include]属性。像这样...

[MetadataType(typeof(ToolingGroup.MetaData)] 
public partial class ToolingGroup { 
    private class MetaData { 

     // adding this attribute tells RIA services 
     // to also send this property across 
     [Include] 
     public MetaData MetaData { get; set; } 
    } 
} 

这是一个糟糕的巧合,你的类型被称为“元数据”,该ToolingGroup.MetaData类是RIA服务使用的元数据。

+1

不需要命名“元数据”类“元数据”!你可以自由地命名它,因为它将设置在'MetadataTypeAttribute' :) – AbdouMoumen 2011-03-16 21:50:29

+0

是的,我注意到,当命名我的表时,MetaData是一个糟糕的选择 - 当然事实上。但是 - 我没有看到添加[Include]属性的位置。 – 2011-03-16 21:56:18

+0

你可以看看这个截图,看看我是否在正确的位置添加属性? http://img855.imageshack.us/i/include.png/否则,我的解决方案中看不到任何类似于您的示例的代码。 – 2011-03-16 22:01:34