2009-08-20 11 views
0

J'utilise un contrôle FormView pour modifier un enregistrement extrait à l'aide d'un LinqDataSource. Essentiellement, le balisage pour la FormView et la source de données ressemble à ceci:Utilisation d'un formulaire avec LINQ

<asp:FormView ID="RuleInstancePropertiesFormView" runat="server" DataKeyNames="RuleInstanceId" 
DataSourceID="RuleInstanceDataSource" DefaultMode="Edit" Visible="false" 
CssClass="PropertiesTable"> 
<EditItemTemplate> 
    <asp:Label ID="RuleInstanceId" runat="server" Text='<%# Eval("RuleInstanceId") %>' /> 

    <telerik:RadTextBox ID="RuleInstanceNameTextBox" 
         runat="server" 
         Text='<%# Bind("Rule.Name") %>' /> 

    <telerik:RadTextBox ID="LimitIndexTextBox" 
         runat="server" 
         Text='<%# Bind("LimitIndex") %>' /> 
</EditItemTemplate> 
</asp:FormView> 
<asp:LinqDataSource ID="RuleInstanceDataSource" runat="server" 
    ContextTypeName="Questionnaire.QuestionnairesDataContext" 
    TableName="RuleInstances" EnableUpdate="true"> 
</asp:LinqDataSource> 

Le disque que je suis l'édition a une référence clé étrangère à une autre table, à savoir la table « Règle ». Dans FormView, j'ai besoin d'éditer des champs dans cette table de clé étrangère (j'ai une liaison au champ Rule.Name dans le code ci-dessus).

Lorsque j'essaie d'enregistrer mes modifications, le champ local (LimitIndex) est enregistré correctement dans la base de données, mais le champ étranger (Rule.Name) ne l'est pas. Je suis un peu perplexe à ce sujet, car FormView récupère correctement la valeur actuelle de Rule.Name, mais refuse de le reconduire à l'objet LINQ.

J'espère que tout le monde peut aider, merci :)

+0

Sinon, si je pouvais spécifier un objet de projection personnalisé à utiliser dans ma requête LINQ, alors je pourrais spécifier ma liaison de données entre cet objet de projection et mon objet Rule (avec des références de tables étrangères) Il semble juste que LinqDataSource ne permet pas d'utiliser des requêtes de sélection personnalisées si elle doit également supporter les mises à jour automatiques :(. –

Répondre

0

D'accord, j'ai trouvé une solution alternative (mais pas élégante). J'utilise un ObjectDataSource au lieu d'un LinqDataSource. J'ai alors défini une classe

public class RuleInstanceProjection { 
    public RuleInstanceProjection(){} 

    // Bind properties from the LINQ object. 
    public RuleInstanceProjection(RuleInstance instance) { ... } 

    public int RuleInstanceId {get; set;} 
    public string Rule_Name {get;set;} 
    ... 
} 

L'objet ci-dessus prend un RuleInstance en tant que constructeur, et met à jour ses propres propriétés avec toutes les valeurs que j'ai besoin dans le FormView. Je configure ensuite ObjectDataSource pour utiliser une autre classe personnalisée, RuleInstanceProjectionDS, comme source de données. Cette classe gère les mises à jour et inserts de ma classe RuleInstanceProjection personnalisée:

public class RuleInstanceProjectionDS 
{ 
    public RuleInstanceProjectionDS() { } 

    public RuleInstanceProjection GetRuleInstance(int ruleInstanceId) 
    { /* Retrieve the RuleInstance, and instantiate 
     a RuleInstanceProjection object */ } 

    public void SaveInstanceProjection(InstanceProjection projection) 
    { /* Map fields back to the LINQ objects and submit. */ } 
} 

Je ne peux donc gérer toutes les applications dans ces deux classes. Maintenant, je n'ai qu'à décider si c'est mieux que de mettre directement à jour les contrôles GUI ...

Je dois dire que ce n'est pas la solution la plus élégante, et j'espère qu'il y aura un meilleur cadre de liaison de données plus tard versions d'ASP.NET. Le seul courant semble gérer les cas les plus triviaux :(

0

vous spécifiez la table à utiliser comme source de données en utilisant la propriété TableName. Cela contrôle quelle table Linq2Sql mettra à jour et limitera donc la mise à jour à la table RulesInstances.

+0

D'accord, c'est ce que je pensais Merci, vous avez des idées sur ce que je peut faire alors? Je pense que la seule option que j'ai maintenant est de faire toute la liaison de données dans le code-behind –

+0

Oui, malheureusement, vous allez faire cela dans le code derrière. –

Questions connexes