如何将ICollection值存储到MVC5中的数据库中?

问题描述:

我有一个商业模型,该模型简单地从ApplicationUser继承,并在其内部我已经定义像这样的字段:如何将ICollection值存储到MVC5中的数据库中?

public class Business : ApplicationUser 
{ 
    ... 

    public virtual ICollection<Subcategory> Subcategories { get; set; } 

    ... 
} 

然后,我已经创建了这个特定的模型的图模型,它也包括上述行,所以它有这个:

public class BusinessViewModel 
{ 
    ... 

    public virtual ICollection<Subcategory> Subcategories { get; set; } 

    ... 
} 

然后,在我看来,我有这样的事情:

<div class="form-group"> 
    @Html.LabelFor(model => model.Subcategories, "Subcategory", htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     <span id="subcats"> 

     </span> 
    </div> 
</div> 

而且,我填充subcateg根据之前选择的类别,通过AJAX呼叫进行通话。我的JS部分看起来是这样的:

$("#CategoryID").change(function() { 
    $("#subcats").empty(); 

    $.ajax({ 
     type: 'POST', 
     url: '/Account/GetSubcategories', 
     dataType: 'json', 
     data: { id: $("#CategoryID").val() }, 
     success: function (subcategories) { 
      $.each(subcategories, function (i, subcategory) { 
       $("#subcats").append('<input type="checkbox" name="' + subcategory.value + '" value="' + subcategory.id + '" />' + subcategory.value + '<br />'); 
      }); 
     }, 
     error: function (ex) { 
      console.log('Failed to retrieve subcategories! ' + ex); 
     } 
    }); 

    return false; 
}); 

所以,问题是,当表单填写,并在用户点击一个新的商业用户的AspNetUsers内注册的按钮,它工作一切正常,当我有一个业务单一子类别字段,但现在我改变了我的逻辑,并接受了一个业务子类别的集合。我不知道如何将它存储在数据库中,我有类似的东西,但正如您可以注意到我不存储子类别。我怎样才能存储子类别?

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> RegisterBusiness(BusinessViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = new Business { BusinessName = model.BusinessName, BusinessAddress = model.BusinessAddress, CategoryID = model.CategoryID, 
      BusinessZip = model.BusinessZip, BusinessPhone = model.BusinessPhone, BusinessDescription = model.BusinessDescription, Facebook = model.Facebook, Twitter = model.Twitter, UserName = model.BusinessName, Email = model.Email }; 
     var result = await UserManager.CreateAsync(user, model.Password); 

     if (result.Succeeded) 
     { 
      ... 
     } 
     AddErrors(result); 
    } 

    ... 
} 

我怎样才能得到被检查的子类别,然后将它们作为一个集合存储在数据库中?

你可以做这样的事情:

foreach(var subcategory in model.Subcategories) 
{ 
    db.Entry(subcategory).State = EntityState.Unchanged; 
    user.Subcategories.Add(subcategory); 
} 

哪里db是你ApplicationDbContext。基本上,这循环遍历模型中的所有子类别,在实体状态方面将它们标记为不变(因此,框架不会尝试将它们添加为数据库的新增类别),然后将子类别添加到用户的集合中。

+0

我知道上面的代码只检查不添加新的子类别,但我如何将它们与业务同步?正如您在上面看到的,我创建了一个新的业务对象,并且只需将所有字段分配给来自该模型的字段,但是如何将该子类别分配给业务?因为它是一个集合而不是单个对象?这是我的问题。 – tett 2014-09-05 21:57:18

+0

你的代码看起来很好。您只需循环子类别并将其添加到业务集合中,如上所示。 1)实例化业务类。 2)如我所示添加子类别。 3)使用'CreateAsync'创建业务。 – 2014-09-05 22:00:11

+0

明白了,所以你的意思是我需要在我的'var user ...'和'var result ...'行之间插入你的代码。对? – tett 2014-09-06 09:39:58