Entity Framework / RIA Services Включить не работает
У меня есть приложение SLA / 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, чтобы он мог быть проверен до возврата метода. Если я установлю точку останова перед возвратом метода и добавлю строку в окно наблюдения, 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
Я проверил, чтобы убедиться, что ToolingGroup, возвращаемая вызовом.First() в обоих случаях, была одной и той же сущностью, и это было так.
Почему метаданные теряются (например, в ноль) между методом сервиса и методом пользовательского интерфейса?
РЕШЕНИЕ:
// 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 ответ
Здесь есть два уровня: EF и RIA Services. Вы обработали часть 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.