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

Silverlight 实体框架/RIA服务包括不工作,silverlight,entity-framework-4,ria,Silverlight,Entity Framework 4,Ria,我有一个SL4/WCF RIA Services/EF4应用程序。将包含的实体放入SL4数据上下文时遇到问题 在应用程序的服务器端服务部分,这是我的方法: [Query(IsDefault = true)] public IQueryable<ToolingGroup> GetToolingGroups() { var groups = this.ObjectContext.ToolingGroups.Include("MetaData").Orde

我有一个SL4/WCF RIA Services/EF4应用程序。将包含的实体放入SL4数据上下文时遇到问题

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

 [Query(IsDefault = true)]
    public IQueryable<ToolingGroup> GetToolingGroups()
    {
        var groups = this.ObjectContext.ToolingGroups.Include("MetaData").OrderBy(g => g.Name);
        return groups; //breakpoint set here
    }
当我让该方法返回并在silverlight ui中检查它时,完成的事件元数据为null

void loadOperation_Completed(object sender, System.EventArgs e)
    {
        grid.ItemsSource = _toolingContext.ToolingGroups;
        UpdateUI(); //breakpoint set here
    }
在监视窗口中执行此操作时,元数据为空:

_toolingContext.ToolingGroups.First().MetaData
我检查以确保调用返回的ToolingGroup。首先,在这两种情况下都是同一个实体,并且都是

为什么元数据会丢失,例如服务方法和我的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; }
    }
}

这里有两层,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; }
    }
}

很不幸,您的类型被称为Metadata,ToolingGroup.Metadata类是RIA服务使用的元数据。

这里有两层,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; }
    }
}

您的类型被称为Metadata是一个糟糕的巧合,ToolingGroup.Metadata类是RIA服务使用的元数据。

命名元数据类Metadata不是强制性的!您可以随意命名它,因为它将在MetadataTypeAttribute中设置:是的,我注意到在命名我的表时,元数据是一个错误的选择——当然,这是事实。但是-我不知道在哪里添加[Include]属性。你能看看这个屏幕截图,看看我是否在正确的位置添加属性吗?否则,在我的解决方案中,我看不到任何类似于您的示例的代码。不,这是生成的代码。在您的web项目中,只需添加一个名为ToolingGroup.metadata.cs的文件或任何您想要的文件,这只是惯例,然后在我的答案中添加上面的代码。这篇博文详细介绍了元数据类:谢谢!我在添加代码时遇到了冲突,但它允许我查找已经存在的类,因此我在那里添加了[Include]属性。用正确的代码更新了我的原始帖子,以便其他人可以看到。命名元数据类元数据不是强制性的!您可以随意命名它,因为它将在MetadataTypeAttribute中设置:是的,我注意到在命名我的表时,元数据是一个错误的选择——当然,这是事实。但是-我不知道在哪里添加[Include]属性。你能看看这个屏幕截图,看看我是否在正确的位置添加属性吗?否则,在我的解决方案中,我看不到任何类似于您的示例的代码。不,这是生成的代码。在您的web项目中,只需添加一个名为ToolingGroup.metadata.cs的文件或任何您想要的文件,这只是惯例,然后在我的答案中添加上面的代码。这篇博文详细介绍了元数据类:谢谢!我在添加代码时遇到了冲突,但它允许我查找已经存在的类,因此我在那里添加了[Include]属性。用更正的代码更新了我的原始帖子,以便其他人可以看到。