1

Je travaille sur une application Silverlight 3 avec les services RIA. L'application est en cours d'exécution mais, pour une raison ou une autre, elle ne lit que les données, sans les modifier.Silverlight 3 + Engagement de données RIA Services Publication

La plupart des exemples en ligne que j'ai vus utilisent Linq2Entities; nous utilisons Linq2SQL (notre modèle de données est assez bon que-est sans abstraction.)

Voici un extrait du Service:

[EnableClientAccess] 
public class FooService : LinqToSqlDomainService<FooDataContext> 
{ 
    [RequiresAuthentication()] 
    public IQueryable<UserProfile> GetUserProfiles() 
    { 
     return this.Context.UserProfiles; 
    } 

    [RequiresAuthentication()] 
    public void InsertUserProfile(UserProfile profile) 
    { 
     this.Context.UserProfiles.InsertOnSubmit(profile); 
    } 

    [RequiresAuthentication()] 
    public void UpdateUserProfile(UserProfile currentProfile) 
    { 
     this.Context.UserProfiles.Attach(currentProfile, true); 
    } 

    [RequiresAuthentication()] 
    public void DeleteUserProfile(UserProfile profile) 
    { 
     this.Context.UserProfiles.Attach(profile, profile); 
     this.Context.UserProfiles.DeleteOnSubmit(profile); 
    } 
} 

Voici un extrait du XAML J'utilise:

<dataControls:DataForm x:Name="_profileForm" AutoGenerateFields="False" CommandButtonsVisibility="Commit" AutoEdit="True" > 
       <dataControls:DataForm.EditTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Vertical"> 
          <dataControls:DataField Label="Username"> 
           <TextBox Text="{Binding UserName, Mode=TwoWay}" /> 
          </dataControls:DataField> 

          <dataControls:DataField Label="First Name"> 
           <TextBox Text="{Binding FirstName, Mode=TwoWay}" /> 
          </dataControls:DataField> 

          <dataControls:DataField Label="Last Name"> 
           <TextBox Text="{Binding LastName, Mode=TwoWay}" /> 
          </dataControls:DataField> 

          <dataControls:DataField Label="Password"> 
           <PasswordBox Password="{Binding Password, Mode=TwoWay}"/> 
          </dataControls:DataField> 

          <!-- [Snip] --> 

          </dataControls:DataField> 
         </StackPanel> 
        </DataTemplate> 
       </dataControls:DataForm.EditTemplate> 
      </dataControls:DataForm> 

Et voici un extrait de la page Silverlight:

public partial class Profile : Page 
{ 
    private FooContext _dataContext; 

    public Profile() 
    { 
     InitializeComponent(); 
     this._dataContext = new FooContext(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     LoadOperation<UserProfile> loadOperation = this._dataContext.Load<UserProfile>(this._dataContext.GetUserProfilesQuery()); 
     loadOperation.Completed += new EventHandler(this.LoadOperation_Completed); 
    } 

    private void LoadOperation_Completed(object sender, EventArgs e) 
    { 
     // Bind the RIA data to the controls 
     LoadOperation<UserProfile> loadOperation = sender as LoadOperation<UserProfile>; 
     this._profileForm.EditEnded += new EventHandler<DataFormEditEndedEventArgs>(ProfileForm_EditEnded); 
     this._profileForm.ItemsSource = loadOperation.Entities; 
     this._profileForm.CurrentIndex = 0; 
    } 

    private void ProfileForm_EditEnded(object sender, DataFormEditEndedEventArgs e) 
    { 
     this._dataContext.SubmitChanges(); 
    } 

Répondre

0

Merci à tous pour l'aide! J'ai finalement compris ce qu'il fallait pour que cela fonctionne. Je ne suis pas sûr exactement pourquoi encore mais cela a résolu le problème. J'ai changé la méthode de mise à jour à ce qui suit:

[RequiresAuthentication()] 
public void UpdateUserProfile(UserProfile currentProfile) 
{ 
    UserProfile originalProfile = this.ChangeSet.GetOriginal(currentProfile); 
    this.Context.UserProfiles.Attach(currentProfile, originalProfile); 
} 

whew. Maintenant, juste pour comprendre pourquoi il était incapable de joindre l'entité avant de saisir sa version originale.

Merci encore à tous, très apprécié !!

+0

Peut-être lié à cela? http://blog.davidyack.com/journal/2009/7/21/ria-services-domaindatasourcedata-not-updating.html –

+0

Vous pouvez avoir ce genre de problème s'il y a une discordance dans vos dataclasses, dans mon cas, je avait un champ char (1) dans la base de données qui était null, mais les champs de données avaient le champ comme Nullable false – Martin

1

y at-il une erreur, ne fait rien se passe-t-il lorsque vous appelez SubmitChanges?

Voici ce que je vais essayer:

  1. points d'arrêt sur les méthodes CRUD du serveur pour vous assurer qu'ils sont appelés.
  2. Assurez-vous que vous ne transmettez pas la valeur NULL pour l'une des valeurs, comme that can cause a new instance to be created rather than an update of the existing entity.
  3. Je vais essayer d'ajouter un événement OnSubmitCompleted pour vérifier les erreurs. Exemple de code (from this PDF):

    this._dataContext.SubmitChanges(OnSubmitCompleted, null); 
    
    private void OnSubmitCompleted(SubmitOperation so) 
    { 
         if (so.Error != null) 
         { 
           string message = so.Error.Message; 
           if (so.EntitiesInError.Any()) 
           { 
             message = string.Empty; 
             Entity entityInError = so.EntitiesInError.First(); 
             if (entityInError.Conflict != null) 
             { 
               EntityConflict conflict = entityInError.Conflict; 
               foreach (EntityConflictMember cm in 
                          conflict.MemberConflicts) 
               { 
                 message += string.Format( 
                   "Member '{0}' in conflict: Current: {1}, 
                         Original: {2}, Store: {3}", 
                   cm.PropertyName, cm.CurrentValue, 
                   cm.OriginalValue, cm.StoreValue); 
               } 
             } 
             else if (entityInError.ValidationErrors.Any()) 
             { 
               message += "\r\n" + 
                entityInError.ValidationErrors.First().Message; 
             } 
           } 
           MessageBox.Show(message, "Submit Failed", MessageBoxButton.OK); 
         } 
    } 
    
+0

1. J'ai défini les points d'arrêt et appelle la méthode de mise à jour. 2. Aucune valeur nulle n'est transmise (et aucun nouvel enregistrement n'apparaît dans la base de données). 3. Ajout de cet événement et de so.Error = null. La sortie sur le client Silverlight semble normale; J'ai même ajouté un DataGrid et il reflète les changements de la forme de données. J'ai testé les éléments suivants sur le service juste pour s'assurer qu'il ne s'agissait pas d'un problème d'écriture avec la base de données: var profile = (à partir des profils dans Context.UserProfiles où profiles.DBPrimaryKey == 1 select profiles) .Premier(); profile.LastName = "Modifié"; Contexte.Soumettre des changements(); –

+0

Mon suspect actuel est la méthode UpdateUserProfile() sur le service de domaine, mais j'ai essayé plusieurs variantes sans modification. On l'appelle cependant, j'ai vérifié cela. –

2

Est-ce que la suppression [RequiresAuthentication] comportement de changement du tout?

Une autre chose à vérifier pourrait être le fichier de configuration - en particulier les verbes de déclaration HttpHandler (GET, POST).

(liste des messages meetup sanglante - je frappe ma limite de 3 message pour le jour comme newb): P