Как добавить новый объект в контекст домена и сразу увидеть его в элементах управления с привязкой к данным перед SubmitChanges? - PullRequest
1 голос
/ 11 марта 2011

У меня есть приложение Silverlight 4 RIA Services (SP1), использующее Entity Frameworks 4 CTP5. Я могу привязать сетку или список к IEnumerable, загруженному контекстом домена, и он показывает данные с сервера. Отлично.

Теперь я хочу создать новый экземпляр MyEntity и добавить его к данным на стороне клиента, чтобы пользователь мог видеть вновь добавленную сущность. MyEntity является истинным потомком сущности, а не POCO.

Единственный метод Add, который я могу найти, это domainContext.EntityContainer.GetEntitySet<MyEntity>().Add(newobj)

Это добавляет новый объект в контекст домена, и domainContext.HasChanges становится истинным, но новый объект не отображается в элементах управления с привязкой к данным.

Как заставить новый объект отображаться в элементах управления с привязкой к данным до SubmitChanges?

(Вероятно, это связано с этим ТАКИМ вопросом от лет назад, который так и не получил ответа)

Вот серверные объявления службы домена, по запросам:

[EnableClientAccess()]
public class MyDomainService : LinqToEntitiesDomainService<MyObjectContext>
{
    protected override MyObjectContext CreateObjectContext()
    {
        return new MyObjectContext();
    }

    public IQueryable<MyEntity> GetMyEntities()
    {
        return this.ObjectContext.MyEntities;
    }

    public void InsertMyEntity(MyEntity MyEntity)
    {
        // ...
    }

    public void UpdateMyEntity(MyEntity currentMyEntity)
    {
        // ...
    }

    public void DeleteMyEntity(MyEntity MyEntity)
    {
        // ...
    }
}

Ответы [ 3 ]

2 голосов
/ 12 марта 2011

Я понял это с помощью комбинации моих собственных проб и ошибок и подсказок, предоставленных некоторыми другими ответами на этот вопрос.

Ключевым моментом, который мне не хватало, было то, что ViewModel недостаточно для отслеживания DomainContext и раздачи результатов запроса в View для привязки данных. ViewModel также должен захватывать и сохранять результаты запроса, если вы хотите, чтобы добавляемые и удаляемые сущности, выполняемые ViewModel, отображались в пользовательском интерфейсе до DomainContext.SubmitChanges (). ViewModel должна применить эти добавления к представлению коллекции результатов запроса.

Свойство коллекции ViewModel для привязки данных View. В этом случае я использую Telerik QueryableDomainServiceCollectionView , но могут использоваться другие виды коллекций:

    public IEnumerable<MyEntity> MyEntities
    {
        get
        {
            if (this.view == null)
            {
                DomainContextNeeded();
            }
            return this.view;
        }
    }

    private void DomainContextNeeded()
    {
        this.context = new MyDomainContext();
        var q = context.GetMyEntitiesQuery();
        this.view = new Telerik.Windows.Data.QueryableDomainServiceCollectionView<MyEntity>(context, q);
        this.view.Load();
    }

Функция ViewModel, которая добавляет новый объект для отображения интерфейса:

public void AddNewMyEntity(object selectedNode)
{
    var ent = new MyEntity() { DisplayName = "New Entity" };

    if (selectedNode == null)
    {
        this.view.AddNew(ent);
    }
    else if (selectedNode is MyEntity)
    {
        ((MyEntity)selectedNode).Children.Add(ent);
    }
}

В других ответах упоминается ObservableCollection. Результаты запроса и представление коллекции могут не возвращать экземпляры ObservableCollection. Они могут быть просто IEnumerables. Важно то, что они реализуют INotifyCollectionChanged и IEditableCollectionView .

Спасибо тем, кто предоставил ответы. Я добавил +1 к каждому ответу, который был полезен, но поскольку никто не решил мою проблему напрямую, я не смог оправдать пометку любого ответа как окончательного.

1 голос
/ 11 марта 2011

Я предполагаю, что вы связываете свой контроль с IEnumerable, который предоставляется LoadOperation<TEntity>.Entities. В этом случае ваш источник привязки не является DomainContext.GetEntitySet<MyEntity>().

DomainContext.GetEntitySet<MyEntity>() содержит все ваши текущие отслеженные экземпляры MyEntity, включая тот, который вы добавили с .Add().

LoadOperation<TEntity>.Entities содержит только экземпляры MyEntity, которые были фактически загружены вашим последним LoadOperation / Query.

У вас есть два варианта: либо добавить новую сущность в коллекцию ItemsSource для вашего элемента управления (я рекомендую это сделать), либо пересобрать коллекцию с содержимым DomainContext.GetEntitySet<MyEntity>(). Это может содержать другие элементы, которые вы не очистили ранее.

1 голос
/ 11 марта 2011

Ваш domainContext будет иметь свойство domainContext.MyEntities. Разве это не появляется там, когда вы добавляете это?

Привязать к этой коллекции или просмотреть эту коллекцию на предмет изменений.

domainContext.MyEntities.PropertyChanged + = MyEventHandler;

...