Silverlight 实体框架/RIA服务包括不工作
我有一个SL4/WCF RIA Services/EF4应用程序。将包含的实体放入SL4数据上下文时遇到问题 在应用程序的服务器端服务部分,这是我的方法: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
[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]属性。用更正的代码更新了我的原始帖子,以便其他人可以看到。