我只是对WCF服务的含义模糊不清,但由于Asp.Net程序员(在Object数据层和数据访问层编程)的大多数工作也需要您了解WCF服务,我可能还需要学习WCF服务.但那时还有ADO.NET数据服务
这两种技术是否竞争(又名是执行相同的任务)还是至少在某些领域重叠?
如果他们竞争,你会建议学习哪两个?
其中一个仅用于非常特定的场景,而其他的更常用(我知道我在这里概括太多:))?
我正在编写一个使用Entity Framework 4和WCF Data Services的ASP.NET MVC 2应用程序.
我想根据一些复选框的状态来操纵Duties和Workers之间的多对多(复合键)关系.
工人可能有零或多个职责.职责可能有零个或多个工人.
此代码来自我的一个控制器:
//
// POST: /Duty/Edit/5
[HttpPost]
public ActionResult Edit(Duty Model, FormCollection collection)
{
ctx.AttachTo("Duties", Model);
ctx.UpdateObject(Model);
// handle checkboxes
ctx.LoadProperty(Model, "Workers");
foreach (Worker w in ctx.Workers)
{
bool isChecked = collection[w.Id.ToString()].Contains("t");
bool wasChecked = Model.Workers.Contains(w);
if (isChecked && !wasChecked)
{
Model.Workers.Add(w);
}
else if (wasChecked && !isChecked)
{
Model.Workers.Remove(w);
}
}
ctx.SaveChanges();
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
该Add()和Remove()方法适当地调用.这毫无例外地执行.但是,更改不会提交到我的数据库.为什么?
我试过把它翻过来w.Duties.Add(Model);,但也不起作用.
例如,我有一个与地址相关的联系人表.要与数据库通信,我使用WCF数据服务.我有一个表单,其中有联系信息,上面有可能的地址列表.现在我创建'要插入的地址'列表并使用(上下文是实体数据上下文)插入联系人:
context.AddToContact(contact);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
之后,我可以获取插入的contact.ID并将其作为父ID添加到地址列表中的所有地址:
cacheAddressList.ForEach(a =>
{
address.ContactID = contact.ID;
context.AddToAddress(address);
}
);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
所以我必须做2次插入.
我知道在实体框架中我可以将子项添加到父项,如果我有它们之间的导航属性.在我的情况下,我有导航,但这样的代码不起作用(联系还没有保存..):
context.AddToContact(contact);
cacheAddressList.ForEach(a =>
{
address.Contact = contact;
}
);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
是否可以在一次交易中插入所有孩子和父母?因为如果可能的话 - 我不必在父插入后创建所有要添加的子列表.
c# foreign-key-relationship entity-framework-4 wcf-data-services
我有一个Windows Phone 7应用程序(当前)调用OData服务来获取数据,并将数据抛出到列表框中.现在它非常缓慢.我能想到的第一件事是因为OData返回的数据比我实际需要的多.
有哪些建议/最佳实践可以加速在Windows Phone 7应用程序中获取数据?我可以在应用程序中做些什么来加快数据检索并更快地进入用户面前?
我有一个项目通过Web服务公开Entity Framework数据.我想知道我应该使用OData还是编写自己的WCF服务?似乎OData已经死了.我对吗?
我已经创建了一个wcf服务,但我已经使用了3个项目;
1)ServiceLibrary(WCF库)
2)Web
3)ConsoleTestClient
我的ServiceLibraryapp.config文件如下所示;
<system.serviceModel>
<services>
<service name="MrDAStoreJobs.ServiceLibrary.AdvertisementService">
<clear />
<endpoint address="basic"
binding="basicHttpBinding" bindingConfiguration=""
contract="MrDAStoreJobs.ServiceLibrary.Interface.IAdvertisementService" />
<endpoint name="mexHttpBinding"
contract="IMetadataExchange"
binding="mexHttpBinding"
address="mex" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:13758/" />
</baseAddresses>
</host>
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information,
set the value below to false before deployment -->
<serviceMetadata httpGetEnabled="True" />
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid …Run Code Online (Sandbox Code Playgroud) 任何人都可以用简单的英语简明扼要地向我解释几个要点,WCF数据服务的详细JSON和JSON之间的主要区别是什么?微软发现了一个名为"JSON light一目了然"的文档,但它长达23页!我不关心元数据; 我只关心数据.我知道JSON灯会掉落"d"包装.还要别的吗?数据类型(日期,布尔值等)是否以相同的格式发送?
编辑:我意识到现在微软现在简单地称JSON灯为"JSON",而JSON详细是旧的,已弃用的标准.为了清晰起见,我称之为新标准"JSON灯".
Default.aspx.cs
WCFService.Service1Client client = new WCFService.Service1Client();
string stream = client.JsonSerializeFromDatabase();
client.Close();
WCFService.Service1Client client2 = new WCFService.Service1Client();
foreach (WCFService.Person in client2.JsonDeserializeFromDatabase(stream))
Run Code Online (Sandbox Code Playgroud)
Service1.svc.cs
public IList<Person> JsonDeserializeFromDatabase(string value)
{
MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(value));
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<Person>));
IList<Person> tableData = (IList<Person>)ser.ReadObject(ms);
ms.Close();
ms.Dispose();
return tableData;
}
Run Code Online (Sandbox Code Playgroud)
IService1.cs
[OperationContract]
IList<Person> JsonDeserializeFromDatabase(string value);
Run Code Online (Sandbox Code Playgroud)
服务器Web.config
<httpRuntime maxRequestLength="8192"/>
</system.web>
...
<system.serviceModel>
<services>
<service name="TestWCF.Service1" behaviorConfiguration="TestWCF.Service1Behavior">
<endpoint address="" binding="wsHttpBinding" contract="TestWCF.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="TestWCF.Service1Behavior">
<serviceMetadata …Run Code Online (Sandbox Code Playgroud) wcf httpresponse wcf-binding wcf-data-services json-deserialization
我正在尝试向OData服务提交一些JSON.根据$ metadata,它预计这种类型:
<Property Name="curClaimValue" Type="Edm.Decimal" Nullable="true" Precision="19" Scale="4"/>
Run Code Online (Sandbox Code Playgroud)
这是我的JSON的一部分:
...... "curClaimValue":654321 ...
这是错误消息:
处理请求流时出错.将值从请求有效负载转换为属性'curClaimValue'到类型'Decimal'时遇到错误,这是属性的预期类型.
如果您需要更多信息,请与我们联系.
谢谢,斯蒂芬
在WCF/Web服务的OData 返回宁静类型的项目vBeheer.
在客户端我创建了消耗的方法:
SRTDBEntities es = new SRTDBEntities(_serviceRoot);
return es.vBeheer.Where(b =>
b.TrackID == trackid &&
b.PersoonID == CurrentPersoon.ID );
Run Code Online (Sandbox Code Playgroud)
但是我注意到(在调试一个下午之后)将.ToList()添加到表达式时,结果集会损坏.该Count()项目是正确的,符合市场预期,但该项目的值是错误的.许多都是重复的,很多都丢失了(显然).
所以我在linqpad中测试了这个:
vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19 ).Dump();
Run Code Online (Sandbox Code Playgroud)

但是当添加.ToList()时就出错了
vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19 ).ToList().Dump();
Run Code Online (Sandbox Code Playgroud)
这导致许多重复(没有任何模式?)项目

此行为是意外的和不需要的.而且更有趣.我们确定数据库返回正确的结果,在调试服务器(在webservice中)结果仍然正确,但是当到达客户端时,它出现了可怕的错误.
IT不会成为问题,但数据由DevExpress组件(DXGrid)使用,无论如何都会执行ToList().
nb:在浏览器中执行查询:
http://localhost:52671/SRTDataService.svc/vBeheer()?$filter=TrackID%20eq%2023%20and%20PersoonID%20eq%2019
Run Code Online (Sandbox Code Playgroud)
返回一组预期的唯一项.
wcf ×5
odata ×4
c# ×3
json ×2
linq ×2
web-services ×2
.net ×1
.net-4.0 ×1
ado.net ×1
asp.net ×1
httpresponse ×1
javascript ×1
many-to-many ×1
wcf-binding ×1