Невозможно сохранить информацию о файлах в БД
Я использую ng-upload и ASP MVC, и мой ввод сохраняет несколько файлов. Файлы успешно сохраняются в пути к папке, указанном в контроллере, но информация о файле (id, name, path и recipeId) не сохраняется в db.
После процесса контроллера он возвращается null
на вид.
File.cs
public class File
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Name")]
[StringLength(30, ErrorMessage = "Name cannot be longer than 30 characters.")]
public string Name { get; set; }
[Display(Name = "Path")]
[StringLength(100, ErrorMessage = "Path cannot be longer than 30 characters.")]
public string Path { get; set; }
[ForeignKey("Recipe")]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
}
угловатый
$scope.SelectedFiles = files;
if ($scope.SelectedFiles && $scope.SelectedFiles.length) {
Upload.upload({
url: '/Files/Upload/',
data: {
files: $scope.SelectedFiles,
RecipeId: $scope.recipeID
}
}).then(function (response) {
$timeout(function () {
$scope.Result = response.data;
});
}, function (response) {
if (response.status > 0) {
var errorMsg = response.status + ': ' + response.data;
alert(errorMsg);
} else {
console.log(response.data);
}
}, function (evt) {
$scope.Progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
контроллер
[HttpPost]
public ContentResult Upload(File vm)
{
string path = Server.MapPath("~/Uploads/");
int RecipeId = vm.RecipeId;
foreach (string key in Request.Files)
{
HttpPostedFileBase postedFile = Request.Files[key];
postedFile.SaveAs(path + postedFile.FileName);
File recipefile = new File();
recipefile.Name = postedFile.FileName;
recipefile.Path = path;
recipefile.RecipeId = RecipeId;
db.Files.Add(recipefile);
}
db.SaveChanges();
return Content("Success");
}
Я получаю следующую ошибку.
System.Data.Entity.Validation.DbEntityValidationException was unhandled by user code
HResult=-2146232032
Message=Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
Source=FAC Recipes
StackTrace:
at FACRecipes.Controllers.FilesController.Upload(File vm) in ...Controllers\FilesController.cs:line 52
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
InnerException:
2 ответа
Решение
Я удалил async Task
а также await db.SaveChangesAsync();
поэтому я продолжаю получать ошибку проверки. Проблема заключалась в том, что я установил StringLength
в 30
в File.cs
поэтому я увеличил StringLength
и это сработало! Спасибо всем!
public class File
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Display(Name = "Name")]
[StringLength(500)
public string Name { get; set; }
[Display(Name = "Path")]
[StringLength(100)]
public string Path { get; set; }
[ForeignKey("Recipe")]
public int RecipeId { get; set; }
public virtual Recipe Recipe { get; set; }
}
Я предложу вам добавить блок try catch к вашему коду, а затем сделайте так, чтобы ваш блок catch помог вам найти фактическую ошибку
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
Exception raise = dbEx;
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
// raise a new exception nesting
// the current instance as InnerException
raise = new InvalidOperationException(message, raise);
}
}
throw dbEx;
}