MVC EF - 如何将数组保存到数据库

MVC EF - How to save Array to db

我需要保存一个标签数组,我使用 angular 和 json 从视图传递到控制器。我尝试了以下但 vm.Name 出现为空。

脚本post请求

$http({
method: 'POST',
url: '/RecipeTags/CreateRecipeTag',
data: $scope.selectedTags
}).then(function (response) {
}, function () { alert('Error CreateRecipeTag'); });

样本数组

[{"Id":12,"Name":"Baking","RecipeId":0},{"Id":16,"Name":"Oriental","RecipeId":0},{"Id":17,"Name":"Japanese","RecipeId":0}]

RecipeTagsController.cs

[HttpPost]
    public JsonResult CreateRecipeTag(List<RecipeTag> vm)
    {

        foreach (var tag in vm)
        {
            RecipeTag recipeTag = new RecipeTag();
            recipeTag.Name = vm.Name;
            recipeTag.RecipeId = vm.RecipeId;
            db.RecipeTags.Add(recipeTag);
        }
        db.SaveChanges();
        return Json(vm, JsonRequestBehavior.AllowGet);
    }

RecipeTag.cs

public class RecipeTag
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Display(Name = "Tag")]
    public string Name { get; set; }

    [ForeignKey("Recipe")]
    public int RecipeId { get; set; }
    public virtual Recipe Recipe { get; set; }
}

您必须将 RecipeTag 定义为 DataContract。

像这样:

// Service definition
[ServiceContract(Name = "Service1")]
public interface IMyService
{
    [OperationContract,HttpPost]
    public JsonResult CreateRecipeTag(List<MyRecipeTag> vm);
}

// DataType-Definition for the Service
[DataContract]
public class MyRecipeTag
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public int RecipeId { get; set; }
    public virtual Recipe Recipe { get; set; }
}

// Service implementation
public class MyService : IMyService
{
    [HttpPost]
    public JsonResult CreateRecipeTag(List<RecipeTag> vm)
    {

        foreach (var tag in vm)
        {
            RecipeTag recipeTag = new RecipeTag();
            recipeTag.Name = tag.Name;
            recipeTag.RecipeId = tag.RecipeId;
            db.RecipeTags.Add(tag);
        }
        db.SaveChanges();
        return Json(vm, JsonRequestBehavior.AllowGet);
    }
}

由此,您定义了函数的 class。此 class 可以与 EF 兼容,或者您​​将字段复制给您调用 RecipeTag。

就像@Jasen 说的那样,我将我的动作签名更改为一个集合,并将 vm.RecipeId 更改为 tag.RecipeId 我还使 ActionResult 异步,它终于成功了!谢谢!

[HttpPost]
        public async Task<ActionResult> CreateRecipeTag([Bind(Include = "Id,Name,RecipeId")] List<RecipeTag> vm)
        {
            foreach (var tag in vm)
            {
                RecipeTag recipeTag = new RecipeTag();
                recipeTag.RecipeId = tag.RecipeId;
                recipeTag.Name = tag.Name;
                db.RecipeTags.Add(recipeTag);
                await db.SaveChangesAsync();
            }
            return RedirectToAction("Index");
        }