Silverlight 4.0 如何将新实体添加到域上下文中,并在提交更改之前立即在数据绑定控件中查看它?
我有一个Silverlight 4 RIA服务(SP1)应用程序,使用实体框架4 CTP5。我可以将网格或列表框数据绑定到域上下文加载的IEnumerable,它显示来自服务器的数据。太好了 现在我想创建MyEntity的一个新实例,并将其添加到客户端数据中,以便用户可以看到新添加的实体。MyEntity是一个真正的实体后代,而不是POCO 我能找到的唯一Add方法是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) 这会将新实体添加
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的实例。他们可能只是一群不可名状的人。关键是什么