我有一段时间让WCF数据服务在Silverlight中运行。我正在使用VS2010 RC。
我一直在努力解决需要使用clientaccesspolicy.xml
&的跨域问题。 Web服务器根文件夹中的crossdomain.xml
个文件,但我无法让它工作。我已经使用了Silverlight Web App&同一个项目中的WCF数据服务可以解决这个问题,但是这里的任何建议都会很好。
但是现在我实际上可以看到我的数据来自数据库并在Silverlight中的数据网格中显示我认为我的麻烦已经结束了 - 但没有。我可以编辑数据并且内存中实体正在改变,但是当我调用BeginSaveChanges
(使用适当的异步EndSaveChanges
调用)时,我没有错误,但数据库中没有数据更新。
这是我的WCF数据服务代码:
public class MyDataService : DataService<MyEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
protected override void OnStartProcessingRequest(ProcessRequestArgs args)
{
base.OnStartProcessingRequest(args);
HttpContext context = HttpContext.Current;
HttpCachePolicy c = HttpContext.Current.Response.Cache;
c.SetCacheability(HttpCacheability.ServerAndPrivate);
c.SetExpires(HttpContext.Current.Timestamp.AddSeconds(60));
c.VaryByHeaders["Accept"] = true;
c.VaryByHeaders["Accept-Charset"] = true;
c.VaryByHeaders["Accept-Encoding"] = true;
c.VaryByParams["*"] = true;
}
}
我已经从Scott Hanselman的文章Creating an OData API for StackOverflow including XML and JSON in 30 minutes中捏了OnStartProcessingRequest
代码。
这是我的Silverlight应用程序中的代码:
private MyEntities _wcfDataServicesEntities;
private CollectionViewSource _customersViewSource;
private ObservableCollection<Customer> _customers;
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
_wcfDataServicesEntities = new MyEntities(new Uri("http://localhost:7156/MyDataService.svc/"));
_customersViewSource = this.Resources["customersViewSource"] as CollectionViewSource;
DataServiceQuery<Customer> query = _wcfDataServicesEntities.Customer;
query.BeginExecute(result =>
{
_customers = new ObservableCollection<Customer>();
Array.ForEach(query.EndExecute(result).ToArray(), _customers.Add);
Dispatcher.BeginInvoke(() =>
{
_customersViewSource.Source = _customers;
});
}, null);
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
_wcfDataServicesEntities.BeginSaveChanges(r =>
{
var response = _wcfDataServicesEntities.EndSaveChanges(r);
string[] results = new[]
{
response.BatchStatusCode.ToString(),
response.IsBatchResponse.ToString()
};
_customers[0].FinAssistCompanyName = String.Join("|", results);
}, null);
}
我收到数据的响应字符串绑定到我的网格确定并显示“-1 | False”。
我的目的是让概念验证在这里工作,然后对问题进行适当的分离,将其变成一个简单的业务线应用程序。
我花了好几个小时来做这件事。我被驱使疯了。任何想法如何使这个工作?
答案 0 :(得分:3)
原来我是个白痴。您必须在数据上下文上调用UpdateObject
以显式声明对象已更新。现在这很糟糕。为什么不能跟踪变化?
答案 1 :(得分:1)
如果您想要更改跟踪,则需要生成支持它的客户端类,并且需要使用DataServiceCollection来存储结果。这里有一个很好的描述:http://msdn.microsoft.com/en-us/library/ee373844.aspx