使用绑定在数据库中保存列表对象

时间:2017-12-19 14:42:17

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

所以我是实体框架的新手。我在将数据库保存到数据库时遇到问题。

在控制器中创建方法:

public async Task<IActionResult> Create([Bind("NieuwsArtikelID,titel,datum,imgNaam")] NieuwsArtikel nieuwsArtikel,
        [Bind("blog.inleiding", "blog.inleidingTitel")] Blog blog, [Bind("blog.alinea[i].AlineaTitel", "blog.alinea[i].AlineaTekst")] List<Alinea> alineas)
    {

        if (ModelState.IsValid)
        {
            nieuwsArtikel.blog = blog;
            nieuwsArtikel.blog.alineas = alineas;
            _context.Add(nieuwsArtikel);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(nieuwsArtikel);
    }

将博客数据保存在数据库中工作正常,但保存alinea数据不会起作用。它可能不起作用,因为它是一个列表。问题是:如何在数据库中保存列表对象?

NieuwsArtikel课程:

public class NieuwsArtikel
{  
    public int NieuwsArtikelID { get; set; }
    public string titel { get; set; }
    public string datum { get; set; }
    public Blog blog { get; set; }
    public string imgNaam { get; set; }
}

博客课程:

public class Blog
{
    public int BlogID {get; set;}
    public string inleidingTitel { get; set; }
    public string inleiding { get; set; }

    public List<Alinea> alineas { get; set; }
}

Alinea班:

public class Alinea
{
    public int AlineaID { get; set; }
    public string AlineaTitel { get; set; }
    public string AlineaTekst { get; set; }
    public string AlineaQuote { get; set; }
    public string AlineaFoto { get; set; }

    public int BlogForeignKey { get; set; }
    public Blog blog { get; set; }
}

创建视图:

<form asp-action="Create">
<div class="form-horizontal">
    <h4>NieuwsArtikel</h4>
    <hr />
    <!--Alinea begin-->
    @for (int i = 0; i < 2; i++)
    {

            <div class="form-group">
                <label asp-for="blog.alineas[i].AlineaTitel" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="blog.alineas[i].AlineaTitel" class="form-control" />
                    <span asp-validation-for="blog.alineas[i].AlineaTitel" class="text-danger"></span>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="blog.alineas[i].AlineaTekst" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="blog.alineas[i].AlineaTekst" class="form-control" />
                    <span asp-validation-for="blog.alineas[i].AlineaTekst" class="text-danger"></span>
                </div>
            </div>
    }
    <!-- Alinea eindig-->
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>

我只放入了Alinea表格组,以使其更具可读性。

1 个答案:

答案 0 :(得分:0)

   if (ModelState.IsValid)
    {
        nieuwsArtikel.blog = blog;
        nieuwsArtikel.blog.alineas = alineas;
        _context.Add(nieuwsArtikel);

        foreach (Aliena a in alienas)
        {
            _context.Add(a);
        }

        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(nieuwsArtikel);

现在,如果Aliena对象需要外键引用,则必须单独保存它们,因为您不知道nieuwsArtikel对象的ID,直到稍后(如果您在数据库中使用Identity列) )。如果您不这样做,只需将其更改为:

a.foreign_key_property_here = nieuwsArtikel.primary_key_property_here

在调用add之前。这应该做得很好。

还有其他选择。例如,您可以在SQL中使用用户定义的表,并使用存储过程一次发送两组数据。然后,您可以使用OUTPUT子句输出外键引用,并将aliena记录保存在同一事务中。或者你可以将aliena作为XML传递给存储过程并以这种方式保存它们。