Silverlight 3 + Проблем с ангажиране на данни за услугите на RIA

Работя върху приложение Silverlight 3 с RIA Services. Пускам приложението, но по някаква причина то само чете данни, не извършва промени.

Повечето от онлайн примерите, които съм виждал, използват Linq2Entities; ние използваме Linq2SQL (нашият модел на данни е доста добър такъв, какъвто е, без абстракция.)

Ето фрагмент от услугата:

[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);
    }
}

Ето фрагмент от XAML, който използвам:

<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>

И ето фрагмент от страницата 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();
    }

person Nick Gotch    schedule 22.07.2009    source източник


Отговори (3)


Премахването на [RequiresAuthentication] променя ли изобщо поведението?

Друго нещо, което трябва да проверите, може да е конфигурационният файл - по-специално глаголите за декларация на HttpHandler (GET,POST).

(проклет списък със съобщения за среща - достигнах лимита си от 3 съобщения за деня като нов) :P

person JerKimball    schedule 22.07.2009

Има ли грешка, нищо ли не се случва, когато извикате SubmitChanges?

Ето какво бих пробвал:

  1. Задайте точки на прекъсване на CRUD методите на сървъра, за да сте сигурни, че се извикват.
  2. Уверете се, че не подавате NULL за нито една от стойностите, тъй като това може да доведе до нов екземпляр бъде създаден, а не актуализация на съществуващия обект.
  3. Бих опитал да добавя събитие OnSubmitCompleted, за да проверя за грешки. Примерен код (от този 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); 
            } 
    } 
    
person Jon Galloway    schedule 22.07.2009
comment
1. Зададох точките на прекъсване и той извиква метода за актуализиране. 2. Не се предават нули (и няма нови записи, показващи се в DB.) 3. Добавено е това събитие и така. Грешка = null. Изходът на клиента Silverlight изглежда нормален; Дори добавих DataGrid и той отразява промените от формата за данни. Тествах следното в услугата, само за да се уверя, че не е проблем при запис в DB и работи: var profile = (от профили в Context.UserProfiles, където profiles.DBPrimaryKey == 1 изберете профили).First(); profile.LastName = Променено; Context.SubmitChanges(); - person Nick Gotch; 22.07.2009
comment
Настоящият ми заподозрян е методът UpdateUserProfile() на услугата за домейн, но опитах множество негови варианти без промяна. Обажда се обаче, проверих това. - person Nick Gotch; 22.07.2009

Благодаря на всички за помощта! НАЙ-НАКРАЯ разбрах какво е необходимо, за да заработи това. Все още не съм сигурен точно защо, но това реши проблема. Промених метода за актуализиране на следния:

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

леле. Сега просто да разберем защо не е успял да прикачи обекта, преди да вземе оригиналната му версия.

Благодаря отново на всички, много оценявам!!

person Nick Gotch    schedule 22.07.2009
comment
Може би свързано с това? blog.davidyack.com/journal/ 21/7/2009/ - person James Cadd; 23.07.2009
comment
Можете да получите този вид проблем, ако има несъответствие във вашите класове данни, в моя случай имах поле char(1) в базата данни, което беше null, но класовете данни имаха полето като Nullable false - person Martin; 10.02.2010