Entity Framework / RIA Services Включить не работает - PullRequest
1 голос
/ 17 марта 2011

У меня есть приложение 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 будет нулевым.

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 Ответ

4 голосов
/ 17 марта 2011

Здесь есть два уровня: 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.

...