У меня есть приложение службы данных WCF. Внутренняя база данных Ingress и использует nHibernate.
Я пытаюсь извлечь и обновить записи из одной из таблиц. Его структура приведена ниже:
Первые три выделенные столбцы делают первичный ключ.
В моем клиентском приложении я запрашиваю данные, как показано ниже:
private void LoadItemDetails(string itemCode, int commentDate)
{
using(var dc = new MyDataContext(new Uri("http://myservice.myserver.com/Dev/com.OData/IngressData.svc")))
{
var itemDetails = dc
.ItemLineDetails
.Where(d => d.ItemCode.Equals(itemCode) &&
ld.CommentDate == commentDate);
ObsItemLineDetails = new ObservableCollection<ItemLineDets>();
}
}
Затем я обновляю и сохраняю данные, как показано ниже:
private void SaveItemDetails()
{
using(var dc = new MyDataContext(new Uri("http://myservice.myserver.com/Dev/com.OData/IngressData.svc")))
{
foreach(var itemLine in ObsItemLineDetails )
{
var today = DateTime.Today.AddSeconds(-1);
var newCommentDate = (Int32)(today.Subtract(new DateTime(1970, 1, 1,0,0,0))).TotalSeconds;
var itemDetail = dc.ItemLineDetails.Where(d => d.ItemCode.Equals(itemLine.ItemCode) &&
d.LineId == itemLine.LineId &&
d.SearchDate == itemLine.SearchDate).FirstOrDefault();
if (itemDetail != null)
{
itemDetail.CommentDate = newCommentDate;
itemDetail.Comments = GetAutoComment();
dc.UpdateObject(itemDetail);
}
}
dc.SaveChanges();
}
}
Он вызывает исключение в последней строке при SaveChanges
. Ниже приведена запись журнала сервера IIS.
15:52:42.7823 Trace 20 com.OData.DataServiceBase'1 Received: http://myservice.myserver.com/Dev/com.OData/IngressData.svc/ItemLineDetails(ItemCode='001/152/0101',LineId=3,SearchDate=11070945856)
15:52:42.7823 Error 20 com.OData.DataServiceBase'1 Bad Request - Error in query syntax.
at System.Data.Services.RequestUriProcessor.ParsePath(Uri absoluteRequestUri, IDataService service)
at System.Data.Services.RequestUriProcessor.ProcessRequestUri(Uri absoluteRequestUri, IDataService service, Boolean internalQuery)
at System.Data.Services.DataService'1.HandleRequest() at System.Data.Services.RequestUriProcessor.ParsePath(Uri absoluteRequestUri, IDataService service)
at System.Data.Services.RequestUriProcessor.ProcessRequestUri(Uri absoluteRequestUri, IDataService service, Boolean internalQuery)
at System.Data.Services.DataService'1.HandleRequest()
Я думаю, что это, вероятно, прямые косые черты в моем поле ITEM_CODE, вызывающие эту проблему.
Если это так, есть ли какое-либо обходное решение для этого.
попытайтесь добавить использование в DataContext в функцию вместо глобального объекта контекста, как показано ниже
private void SaveItemDetails()
{
using(context dc = new context())
{
foreach(var itemLine in ObsItemLineDetails )
{
var today = DateTime.Today.AddSeconds(-1);
var newCommentDate = (Int32)(today.Subtract(new DateTime(1970, 1, 1,0,0,0))).TotalSeconds;
var itemDetail = dc.ItemLineDetails.Where(d => d.ItemCode.Equals(itemLine.ItemCode) &&
d.LineId == itemLine.LineId &&
d.SearchDate == itemLine.SearchDate).FirstOrDefault();
if (itemDetail != null)
{
itemDetail.CommentDate = newCommentDate;
itemDetail.Comments = GetAutoComment();
dc.UpdateObject(itemDetail);
}
}
dc.SaveChanges();
}
}