Использование примечаний к данным (DisplayColumn) в службах RIA WCF

#entity-framework #silverlight-4.0 #data-annotations #entity-relationship #wcf-ria-services

#entity-framework #silverlight-4.0 #данные-аннотации #сущность-отношение #wcf-ria-services

Вопрос:

Я создал модель entity Framework 4.0 (для первой базы данных), добавил свои частичные классы и использовал DataAnnotations их, чтобы создать идеальный пользовательский интерфейс на клиенте.

У меня есть некоторые связи между моими таблицами, которые используются DisplayColumn поверх моих классов. например, у меня есть User класс, у которого есть [DataColumn("UserName")] атрибут поверх класса. И Message класс, который имеет «общедоступный пользовательский отправитель», который имеет [Include] атрибут поверх свойства.

Кроме того, я использовал .Include("User") в моем DomainService для загрузки пользователя, который связан с сообщением.

Но в моей сетке данных я вижу User : (UserID) (userId = ключевое свойство объекта User) вместо UserName того, что я указал. Я просмотрел сгенерированный код в моем проекте SL, и он правильно украсил мой User класс DisplayColumn атрибутом. Но все равно я не могу видеть UserName в своей сетке.

Любая помощь была бы высоко оценена.
Обновление: Вот мой вопрос в коде:

Как я уже упоминал, Owner , UserName MessageId , UserId , ,, были определены в моей автоматически сгенерированной модели. UserMeta в классе нет ничего особенного.

 [MetadataType(typeof(MessageMeta))]
public partial class Message
{
}  

public class MessageMeta
{
 [Include()]
 [Display(Name = "Belongs to", Order = 4)]
 [Association("Message_User","MessageId","UserId",IsForeignKey =  true)]
 public virtual User Owner { get; set; }
}

[MetadataType(typeof(UserMeta))]
[DisplayColumn("UserName")]
public partial class User
{
}  
  

В моем DomainService:

 public IQueryable<Message> GetMessages()
{
    return this.ObjectContext.Messages.Include("Owner");
}
  

Комментарии:

1. Опубликуйте свой код, иначе! смехотворно, но если серьезно, с этим было бы намного проще помочь, если бы вы опубликовали код, а не просто говорили об этом.

2. @Robotsushi: Обновил мой вопрос перед тем, как его убили: p

Ответ №1:

Наконец, мне пришлось использовать отражение. Для DataGrid:

 private void OnAutoGenerateColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        //Need to get an array, but should always just have a single DisplayColumnAttribute
        var atts = e.PropertyType.GetCustomAttributes(typeof(DisplayColumnAttribute),true);

        foreach (DisplayColumnAttribute d in atts)
        {
            DataGridTextColumn col = (DataGridTextColumn)e.Column;

            //Make sure that we always have the base path
            if(col.Binding.Path.Path!="")
            {
                col.Binding = new Binding()
                {
                    Path = new PropertyPath(col.Binding.Path.Path   "."   d.DisplayColumn)
                };
            }

            //Only do the first one, just in case we have more than one in metadata
            break;
        }

    } 
  

И для Telerik RadGridView:

 var column = e.Column as GridViewDataColumn;
if (column == null)
{
    return;
}

// Need to get an array, but should always just have a single DisplayColumnAttribute  
var atts = column.DataType.GetCustomAttributes(typeof(DisplayColumnAttribute), true);

foreach (DisplayColumnAttribute d in atts)
{
    // Make sure that we always have the base path
    if (column.DataMemberBinding.Path.Path != "")
    {
        column.DataMemberBinding = new Binding()
        {
            Path = new PropertyPath(column.DataMemberBinding.Path.Path   "."   d.DisplayColumn)
        };
     }
     // Only do the first one, just in case we have more than one in metadata
     break;
 }