Динамические данные с 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

Другие вопросы по тегам