【问题标题】:How to store ICollection value into database in MVC5?如何将 ICollection 值存储到 MVC5 中的数据库中?
【发布时间】:2014-09-05 21:40:20
【问题描述】:

我有一个业务模型,它简单地继承自 ApplicationUser,在其中我有一个这样定义的字段:

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>

而且,我通过 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);
    }

    ...
}

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

【问题讨论】:

    标签: c# asp.net-mvc entity-framework


    【解决方案1】:

    你可以这样做:

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

    db 是您的ApplicationDbContext。基本上,这会遍历模型中的所有子类别,将它们标记为实体状态未更改(因此框架不会尝试将它们作为新添加到数据库中),然后将子类别添加到用户的集合中。

    【讨论】:

    • 我知道上面的代码只检查不添加新的子类别,但是我将如何将它们与业务同步?正如您在上面看到的,我创建了一个新的业务对象,并简单地将所有字段分配给从模型中获得的所有字段,但是我将如何将子类别分配给业务呢?因为它是一个集合而不是单个对象?那是我的问题。
    • 您的代码看起来没问题。您需要做的就是遍历子类别并将它们添加到业务集合中,如上所示。 1)实例化业务类。 2)添加子类别,如图所示。 3)使用CreateAsync创建业务。
    • 知道了,所以你的意思是我需要在上面的 var user ...var result... 行之间插入你的代码。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多