#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;
}