Динамические данные с Entity Framework... используя [ScaffoldColumn(true)], чтобы показать общедоступное свойство через метаданные
... это просто не работает, вообще. Я пытался в течение нескольких дней, с различными комбинациями дурацких вещей, и это не сдвинулось с места.
Есть, конечно, люди, которые, похоже, пишут в блогах о том, как справляться с подобными вещами, не видя проблемы, говоря что-то вроде: "Мы все знаем, что вы можете показать публичные свойства расширенных классов EF с помощью..." и "Если Вы хотите расширить свою модель данных, чтобы показать вычисляемое поле, просто..." - не так просто для меня - arghghhhhghhhhhghh!!!
Итак, как и во всех типичных примерах, мой частичный класс EF выглядит так:
[DisplayColumn("Name")]
[MetadataType(typeof(SaleProduct_Metadata))]
public partial class SaleProduct
{
public string Test
{
get
{
return "blah";
}
}
public class SaleProduct_Metadata
{
[ScaffoldColumn(true)]
public string Test;
}
}
Мой global.asax выглядит так:
MetaModel model = new MetaModel();
model.RegisterContext(typeof(Sale.Models.SaleEntities), new ContextConfiguration() { ScaffoldAllTables = true });
routes.Add(new DynamicDataRoute("DD/{table}/{action}.aspx")
{
Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),
Model = model
});
И мой List.aspx.cs выглядит так:
public partial class List : System.Web.UI.Page
{
protected MetaTable table;
protected void Page_Init(object sender, EventArgs e)
{
//DynamicDataManager1.RegisterControl(GridView1, true /*setSelectionFromUrl*/);
table = GridDataSource.GetTable();
DynamicDataManager1.RegisterControl(GridView1, true /*setSelectionFromUrl*/);
GridView1.ColumnsGenerator = new AdvancedFieldGenerator(table, true);
}
protected void Page_Load(object sender, EventArgs e)
{
table = GridDataSource.GetTable();
Title = table.DisplayName;
GridDataSource.Include = table.ForeignKeyColumnsNames;
InsertHyperLink.NavigateUrl = table.GetActionPath(PageAction.Insert);
// Disable various options if the table is readonly
if (table.IsReadOnly)
{
GridView1.Columns[0].Visible = false;
InsertHyperLink.Visible = false;
}
}
protected void OnFilterSelectedIndexChanged(object sender, EventArgs e)
{
GridView1.PageIndex = 0;
}
}
... Я использую версию Dynamic Data Futures для получения таких функций, как упорядочение столбцов, улучшенная проверка и т. Д., Которая работает нормально. Я внес несколько изменений в (например) List.aspx.cs (показанный выше) и изменил форматирование даты, чтобы даты в стиле NZ работали на моем веб-сервере в США. Кроме этого, все довольно стандартно, AFAIK.
Мои EF-модели размещены в отдельной сборке, и я (очевидно) расширяю некоторые из сущностей, используя частичные классы. Я просто хочу показать два рассчитанных кровавых поля, но безуспешно. Я чувствую, что я новый программист, бьющий мою голову о кирпичную стену - ни один из старых приемов не работает. Программирование не должно быть таким сложным:-(
Кто-нибудь, кто-нибудь, пожалуйста, помогите!
Бернард.
2 ответа
Я не уверен, но если вы используете EF 3.5 SP1...
это будет означать, что ваши занятия происходят от EntityObject
Я подозреваю, что Dynamic Data - это особый случай в этой ситуации и использование пользовательских TypeDescriptionProvider
которые знают, как получить метаданные EF из ObjectContext
, а затем подделывает необходимые атрибуты.
Это может быть причиной проблемы, потому что, возможно, это TypeDescriptionProvider
использует только метаданные для свойств, о которых EF знает. Что, конечно, исключает ваши рассчитанные свойства.
Я знаю, что это не "ответ", но, надеюсь, он направит вас в правильном направлении.
Alex
При использовании EF пространства имен вашего частичного класса должны соответствовать пространству имен сгенерированного вами частичного класса. В версиях Linq-2-SQL сгенерированные частичные классы не имеют пространства имен, поэтому он просто работает. http://forums.asp.net/t/1473192.aspx