实体框架/ RIA服务包括不工作

时间:2011-03-16 21:40:46

标签: silverlight entity-framework-4 ria

我有一个SL4 / WCF RIA Services / EF 4应用程序。我在将包含的实体放入SL4数据上下文时遇到了麻烦。

在应用程序的服务器端服务部分,这是我的方法:

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

我将它分配给var组,以便在方法返回之前检查它。如果我在方法返回之前设置断点并在Watch窗口中添加一行,那么MetaData就在那里:

groups.First().MetaData

当我让方法返回并在silverlight ui完成事件中检查它时,MetaData为空。

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

当我在监视窗口中执行此操作时,MetaData为空:

_toolingContext.ToolingGroups.First().MetaData

我检查过以确保在两种情况下通过调用.First()返回的ToolingGroup都是同一个实体,它是。

为什么MetaData在服务方法和我的ui方法之间丢失(例如null)?

解决方案:

// 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; }
    }
}

1 个答案:

答案 0 :(得分: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服务使用的元数据。