Próbuję utworzyć witrynę danych dynamicznych, która powinna umożliwić administratorowi bezpośrednią edycję danych w większości tabel w bazie danych."Typ klucza OR sortowane według kolejności musi być porównywalny do zamówienia" z danymi dynamicznymi
Do tej pory mam klasy EDMX i POCO, wszystkie dołączone do interfejsu używanego do zastosowania DataAnnotations na polach.
Chcę mieć edytowalną siatkę dla każdej tabeli, więc edytowałem szablon ListDetails i postępowałem zgodnie z these instructions, który pozwala mi mieć wbudowaną edycję w ListView.
Dzięki tym wszystkim mogę wyświetlać i edytować dane. To działa.
Ale kiedy klikam na nagłówku (jest to LinkButton
z komendą Sort
i nazwą kolumny jako CommandArgument) kolumny ForeignKey, zawsze otrzymuję następujący wyjątek (ale sortowanie działa na "prostych" właściwościach):
[Wyjątek EntitySqlException: Typ sortowania kluczy ORDER musi być zgodny z porządkiem na poziomie . Blisko ekspresji użytkownik dostępu, wiersz 6, kolumna 3.]
Microsoft.AspNet.EntityDataSource.EntityDataSourceView.ExecuteSelect (DataSourceSelectArguments argumentów) +1325
System.Web.UI.DataSourceView.Select (DataSourceSelectArguments argumentów DataSourceViewSelectCallback zwrotnego) + 21
System.Web.UI.WebControls.DataBoundControl.PerformSelect() +138
System.Web.UI.WebControls.ListView.PerformSelect() +167
System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +30
System.Web.UI.WebControls.BaseDataBoundControl.EnsureDataBound() +105 System.W eb.UI.WebControls.BaseDataBoundControl.OnPreRender (EventArgs e) +22 System.Web.UI.Control.PreRenderRecursiveInternal() +83
System.Web.UI.Control.PreRenderRecursiveInternal() +155
system.Web. UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Control.PreRenderRecursiveInternal() +155
System.Web.UI.Page.ProcessRequestMain (Boolean w tym udeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +974
Przykład tabeli próbuję wyświetlić i sort (jestem wyświetlanie i edytowanie LINK_ENTITES_MODELISEES próbuję uporządkować na kolumnie LOV_LOB):
[MetadataType(typeof(ILINK_ENTITES_MODELISEES_MetaData))]
public partial class LINK_ENTITES_MODELISEES : ILINK_ENTITES_MODELISEES_MetaData
{
public int id_entite_modelisee { get; set; }
public short id_entite { get; set; }
public short id_lob { get; set; }
public System.DateTime date_val_debut { get; set; }
public System.DateTime date_val_fin { get; set; }
public virtual LOV_ENTITE LOV_ENTITE { get; set; }
public virtual LOV_LOB LOV_LOB { get; set; }
}
public partial interface ILINK_ENTITES_MODELISEES_MetaData
{
[Key]
[Required(ErrorMessage = "id_entite_modelisee is required")]
int id_entite_modelisee { get; set; }
[Required(ErrorMessage = "id_entite is required")]
short id_entite { get; set; }
[Required(ErrorMessage = "id_lob is required")]
short id_lob { get; set; }
[Required(ErrorMessage = "date_val_debut is required")]
[DataType(DataType.Date)]
System.DateTime date_val_debut { get; set; }
[Required(ErrorMessage = "date_val_fin is required")]
[DataType(DataType.Date)]
System.DateTime date_val_fin { get; set; }
[Display(Name = "entite")]
LOV_ENTITE LOV_ENTITE { get; set; }
[Display(Name = "lob")]
LOV_LOB LOV_LOB { get; set; }
}
[MetadataType(typeof(ILOV_LOB_MetaData))]
[DisplayColumn("libelle", "libelle", false)]
public partial class LOV_LOB : ILOV_LOB_MetaData
{
public short id { get; set; }
public string libelle { get; set; }
public System.DateTime date_val_debut { get; set; }
public System.DateTime date_val_fin { get; set; }
}
public partial interface ILOV_LOB_MetaData
{
[Key]
[Required(ErrorMessage = "id is required")]
short id { get; set; }
[Required(ErrorMessage = "libelle is required")]
[StringLength(5)]
string libelle { get; set; }
[Required(ErrorMessage = "date_val_debut is required")]
[DataType(DataType.Date)]
System.DateTime date_val_debut { get; set; }
[Required(ErrorMessage = "date_val_fin is required")]
[DataType(DataType.Date)]
System.DateTime date_val_fin { get; set; }
}
Prawdopodobnie nie działa, ponieważ próbuje posortować na właściwości obiektu, a nie na etykiecie, której używa, ale oczekiwałbym, że dane dynamiczne będą z nią korzystały (używa pierwszej właściwości łańcucha jako wartości wyświetlanej, dlaczego " t używa go do sortowania? Ponadto próbowałem również dodać atrybut DisplayColumn z tym samym wynikiem).
Próbowałem obsłużyć zdarzenie ListView.OnSorting
, aby ręcznie edytować właściwość EntityDataSource.OrderBy, dodając do testowania wartość it.LOV_LOB.libelle
. To nie zadziałało. Próbowałem również obsługiwać EntityDataSource.OnSelecting, aby zobaczyć, jaka jest wartość EntityDataSource.OrderBy (jeśli nie ustawię go ręcznie, zawsze jest null
, nawet jeśli sortowanie działa). Wygląda na to, że jest on ignorowany lub zastępowany po tym wydarzeniu. Wyjątek nie określa, co OrderBy próbuje zastosować, więc nie jestem pewien, co próbuje zrobić. Próbowałem zaimplementować IComparable
, ale nie zadziałało. Zmieniłem ToString(), aby zapewnić wartość wyświetlania, to też nie działa.
Nie mam pomysłu. Jakieś sugestie ?
Jeśli to nie rozwiąże problemu, proszę o przedstawienie zapytania. –
Używam tutaj danych dynamicznych, co oznacza, że nie mam żadnych zapytań, wszystko jest automatycznie obsługiwane przez 'EntityDataSource',' QueryExtender' i 'DynamicFilterExpression'. Jak już wspomniałem, próbowałem ręcznie wymusić 'EntityDataSource.OrderBy' na dowolną właściwość obiektu, ale wydaje się, że jest on ignorowany. Wiem, jak sortować kwerendę w SQL lub Entity Framework, ale nie mogę znaleźć, jak to zrobić z danymi dynamicznymi. –
@JulienN kiedy mam czas, ponownie zapoznaję się z odpowiedzią –