Silverlight 4.0 如何将新实体添加到域上下文中,并在提交更改之前立即在数据绑定控件中查看它?

Silverlight 4.0 如何将新实体添加到域上下文中,并在提交更改之前立即在数据绑定控件中查看它?,silverlight-4.0,entity-framework-4,wcf-ria-services,Silverlight 4.0,Entity Framework 4,Wcf Ria Services,我有一个Silverlight 4 RIA服务(SP1)应用程序,使用实体框架4 CTP5。我可以将网格或列表框数据绑定到域上下文加载的IEnumerable,它显示来自服务器的数据。太好了 现在我想创建MyEntity的一个新实例,并将其添加到客户端数据中,以便用户可以看到新添加的实体。MyEntity是一个真正的实体后代,而不是POCO 我能找到的唯一Add方法是domainContext.EntityContainer.GetEntitySet().Add(newobj) 这会将新实体添加

我有一个Silverlight 4 RIA服务(SP1)应用程序,使用实体框架4 CTP5。我可以将网格或列表框数据绑定到域上下文加载的IEnumerable,它显示来自服务器的数据。太好了

现在我想创建MyEntity的一个新实例,并将其添加到客户端数据中,以便用户可以看到新添加的实体。MyEntity是一个真正的实体后代,而不是POCO

我能找到的唯一Add方法是
domainContext.EntityContainer.GetEntitySet().Add(newobj)

这会将新实体添加到域上下文中,domainContext.HasChanges会变为true,但新实体不会显示在数据绑定控件中

在提交更改之前,如何使新实体显示在数据绑定控件中

(可能与多年前那个从未得到答案的问题有关)

以下是域服务的服务器端声明(按请求):

[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)
    {
        // ...
    }
}
[EnableClientAccess()]
公共类MyDomainService:LinqToEntitiesDomainService
{
受保护的重写MyObjectContext CreateObjectContext()
{
返回新的MyObjectContext();
}
公共IQueryable GetMyEntities()
{
返回this.ObjectContext.MyEntities;
}
public void InsertMyEntity(MyEntity MyEntity)
{
// ...
}
公共void UpdateMyEntity(MyEntity currentMyEntity)
{
// ...
}
公共无效删除MyEntity(MyEntity MyEntity)
{
// ...
}
}

您的domainContext将具有属性domainContext.MyEntities。当你添加它时,它不会显示在那里吗

绑定到该集合或查看该集合的更改


domainContext.MyEntities.PropertyChanged+=MyEventHandler

您的domainContext将具有属性domainContext.MyEntities。当你添加它时,它不会显示在那里吗

绑定到该集合或查看该集合的更改


domainContext.MyEntities.PropertyChanged+=MyEventHandler

我假设您将控件绑定到
IEnumerable
,它由
LoadOperation.Entities
提供。在这种情况下,绑定源不是
DomainContext.GetEntitySet()

DomainContext.GetEntitySet()
保存当前跟踪的所有
MyEntity
实例,包括使用
.add()
添加的实例

LoadOperation.Entities
仅包含上次LoadOperation/Query实际加载的
MyEntity
实例


您有两个选项:要么将新实体添加到控件的ItemsSource集合(我建议这样做),要么使用
DomainContext.GetEntitySet()
的内容重建集合。但是,它可能包含您以前未清除的其他元素。

我假定您将控件绑定到
IEnumerable
,该控件由
LoadOperation.Entities
提供。在这种情况下,绑定源不是
DomainContext.GetEntitySet()

DomainContext.GetEntitySet()
保存当前跟踪的所有
MyEntity
实例,包括使用
.add()
添加的实例

LoadOperation.Entities
仅包含上次LoadOperation/Query实际加载的
MyEntity
实例


您有两个选项:要么将新实体添加到控件的ItemsSource集合(我建议这样做),要么使用
DomainContext.GetEntitySet()
的内容重建集合。不过,这可能包含您以前没有清除过的其他元素。

我通过自己的尝试和错误,以及对这个问题的其他一些回答提供的提示,已经解决了这个问题

我缺少的关键点是,ViewModel不足以跟踪DomainContext并将查询结果分发给视图进行数据绑定。如果希望ViewModel执行的实体添加和删除显示在DomainContext.SubmitChanges()之前的UI中,ViewModel还必须捕获并保留查询结果。ViewModel必须将这些添加应用于查询结果的集合视图

视图数据绑定的ViewModel集合属性。在本例中,我使用的是TelerikQueryableDomainServiceCollectionView,但也可以使用其他集合视图:

    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();
    }
其他答复提到了明显的收集。查询结果和集合视图可能不会返回ObservableCollection的实例。他们可能只是一群不可名状的人。重要的是他们实现INotifyCollectionChanged和IEditableCollectionView


感谢那些作出回应的人。我对每一个有帮助的回答都加了+1,但由于没有一个回答直接解决了我的问题,我无法证明将任何回答都标记为最终答案是正确的。

我结合自己的尝试和错误,以及其他一些回答对这个问题提供的提示,找到了答案

我缺少的关键点是,ViewModel不足以跟踪DomainContext并将查询结果分发给视图进行数据绑定。如果希望ViewModel执行的实体添加和删除显示在DomainContext.SubmitChanges()之前的UI中,ViewModel还必须捕获并保留查询结果。ViewModel必须将这些添加应用于查询结果的集合视图

视图数据绑定的ViewModel集合属性。在本例中,我使用的是TelerikQueryableDomainServiceCollectionView,但也可以使用其他集合视图:

    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();
    }
其他答复提到了明显的收集。查询结果和集合视图可能不会返回ObservableCollection的实例。他们可能只是一群不可名状的人。关键是什么