如何通过存储过程和 EF db 优先方法 post Web api 中的数据
How to post data in the web api by stored procedure and EF db first approach
我在我的网络 API 项目中 posting 数据时遇到问题,我有一个操作方法和一个存储过程以及一个 table 想要执行 post 操作,但是当我 post 从 fiddler 我的 table 结构中获取数据时,我收到内部服务器错误消息
public partial class tblImage
{
public string ImageId { get; set; }
public string ImagePath { get; set; }
public string ImageCategory { get; set; }
}
我Visual studio制作的存储过程代码如下
public virtual int InsertDynamicImage(string imageId, string imagePath, string imageCategory)
{
var imageIdParameter = imageId != null ?
new ObjectParameter("ImageId", imageId) :
new ObjectParameter("ImageId", typeof(string));
var imagePathParameter = imagePath != null ?
new ObjectParameter("ImagePath", imagePath) :
new ObjectParameter("ImagePath", typeof(string));
var imageCategoryParameter = imageCategory != null ?
new ObjectParameter("ImageCategory", imageCategory) :
new ObjectParameter("ImageCategory", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("InsertDynamicImage", imageIdParameter, imagePathParameter, imageCategoryParameter);
}
}
我的控制器代码如下
[HttpPost]
[Route("api/tblProducts/DynamicImage")]
public IHttpActionResult AddDynamic(tblImage Review)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var AltAddress = db.InsertDynamicImage(Review.ImageId, Review.ImagePath, Review.ImageCategory);
return CreatedAtRoute("DefaultApi", new { id = Review.ImageId }, Review);
}
fiddler 给出的错误信息如下所示
{
"Message":"An error has occurred.",
"ExceptionMessage":"UrlHelper.Link must not return null.",
"ExceptionType":"System.InvalidOperationException",
"StackTrace":" at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult`1.Execute()\r\n
at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult`1.ExecuteAsync(CancellationToken cancellationToken)\r\n
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
尝试命名您的属性路由。
[Route("api/tblProducts/DynamicImage", name="GetProductImage")]
然后在调用link时使用路由名称。
如果您想了解更多信息,请查看文档 here。
更新
澄清一下,您需要在对 CreatedAtRoute 的调用中使用路由名称。像这样:
return CreatedAtRoute("GetProductImage", new { id = Review.ImageId }, Review);
如果还是不行,你能post你的路由配置吗?
我在我的网络 API 项目中 posting 数据时遇到问题,我有一个操作方法和一个存储过程以及一个 table 想要执行 post 操作,但是当我 post 从 fiddler 我的 table 结构中获取数据时,我收到内部服务器错误消息
public partial class tblImage
{
public string ImageId { get; set; }
public string ImagePath { get; set; }
public string ImageCategory { get; set; }
}
我Visual studio制作的存储过程代码如下
public virtual int InsertDynamicImage(string imageId, string imagePath, string imageCategory)
{
var imageIdParameter = imageId != null ?
new ObjectParameter("ImageId", imageId) :
new ObjectParameter("ImageId", typeof(string));
var imagePathParameter = imagePath != null ?
new ObjectParameter("ImagePath", imagePath) :
new ObjectParameter("ImagePath", typeof(string));
var imageCategoryParameter = imageCategory != null ?
new ObjectParameter("ImageCategory", imageCategory) :
new ObjectParameter("ImageCategory", typeof(string));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("InsertDynamicImage", imageIdParameter, imagePathParameter, imageCategoryParameter);
}
}
我的控制器代码如下
[HttpPost]
[Route("api/tblProducts/DynamicImage")]
public IHttpActionResult AddDynamic(tblImage Review)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var AltAddress = db.InsertDynamicImage(Review.ImageId, Review.ImagePath, Review.ImageCategory);
return CreatedAtRoute("DefaultApi", new { id = Review.ImageId }, Review);
}
fiddler 给出的错误信息如下所示
{
"Message":"An error has occurred.",
"ExceptionMessage":"UrlHelper.Link must not return null.",
"ExceptionType":"System.InvalidOperationException",
"StackTrace":" at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult`1.Execute()\r\n
at System.Web.Http.Results.CreatedAtRouteNegotiatedContentResult`1.ExecuteAsync(CancellationToken cancellationToken)\r\n
at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
尝试命名您的属性路由。
[Route("api/tblProducts/DynamicImage", name="GetProductImage")]
然后在调用link时使用路由名称。
如果您想了解更多信息,请查看文档 here。
更新 澄清一下,您需要在对 CreatedAtRoute 的调用中使用路由名称。像这样:
return CreatedAtRoute("GetProductImage", new { id = Review.ImageId }, Review);
如果还是不行,你能post你的路由配置吗?