[英]Entity Framework / RIA Services Include not working
我有一个SL4 / WCF RIA服务/ 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为null。
void loadOperation_Completed(object sender, System.EventArgs e)
{
grid.ItemsSource = _toolingContext.ToolingGroups;
UpdateUI(); //breakpoint set here
}
当我在监视窗口中执行此操作时,MetaData为null:
_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; }
}
}
这里有两层,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服务使用的元数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.