Невозможно сохранить информацию о файлах в БД

Я использую 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;
            }
Другие вопросы по тегам