c# - Entity Framework SaveChangesAsync 不更新数据库

标签 c# entity-framework asp.net-core

发票类别实体:

public class InvoiceCategory
{     
    [Key]
    Public int InvoiceCategoryID { get; set; }

    [Required]
    public string CategoryName { get; set; }
}

发票项目实体

public class InvoiceItem
{
    [Key]
    public int InvoiceItemID { get; set; }

    [Required]
    public int InvoiceID { get; set; }   

    [Required]
    [Display(Name = "Date Completed")]
    [DataType(DataType.Date)] 
    public DateTime? Date { get; set; }

    [StringLength(50)]
    public string InvoiceCategory { get; set; }  

    [Required]
    [StringLength(200)]
    public string Description { get; set; }

    [Required]
    [StringLength(20)]
    public string Unit { get; set; }     

    [Required]
    [DataType(DataType.Currency)]
    [DisplayFormat(ApplyFormatInEditMode = false, DataFormatString = "{0:c}")]
    public decimal Price { get; set; }

    [Required]
    [DefaultValue(1)]
    public decimal? Quantity { get; set; }

    public virtual Invoice Invoice { get; set; }       
}

发票类别编辑 View

@model Accounts.Models.InvoiceCategory
<h2>Settings</h2>
<br />
<h4>Invoice Categories</h4>
<hr />
<form asp-action="Edit">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    @(Html.Kendo().Grid<Accounts.Models.InvoiceCategory>()
              .Name("InvoiceCategory")
              .ToolBar(tools =>
              {
                  tools.Create().Text("New Category");
              })
              .Editable(editable => editable.Mode(GridEditMode.InCell).CreateAt(GridInsertRowPosition.Bottom).DisplayDeleteConfirmation(false))
              .Columns(columns =>
              {
                  columns.Bound(p => p.InvoiceCategoryID).Hidden().ClientTemplate("#= InvoiceCategoryID #" +
                    "<input type='hidden' name='[#= index(data)#].InvoiceCategoryID' value='#= InvoiceCategoryID #'/>"
                  );

                  columns.Bound(p => p.CategoryName).ClientTemplate("#= CategoryName #" +
                    "<input type='hidden' name='[#= index(data)#].CategoryName' value='#= CategoryName #'/>"
                  );
                  columns.Template("<a class='btn btn-danger btn-sm k-grid-delete'><span class='glyphicon glyphicon-trash'></span> </a>").Width(50);
              })
              .DataSource(dataSource => dataSource.Ajax()
                   .Model(model =>
                   {
                       model.Id(p => p.InvoiceCategoryID);
                       model.Field(p => p.InvoiceCategoryID).Editable(false);
                   })
                   .Read(read => read.Action("InvoiceCategories_Read", "Settings"))                       
                   .ServerOperation(false)
              ).Deferred()
    )
    <br />
    <button type="submit" class="btn btn-success"><span class="glyphicon glyphicon-floppy-disk" style="vertical-align:middle;margin-top:-5px"></span> Save</button>
</form>
@section Scripts {
    @Html.Kendo().DeferredScripts()

    <script>
        function index(dataItem) {
            var data = $("#InvoiceCategory").data("kendoGrid").dataSource.data();
            return data.indexOf(dataItem);
        }
    </script>

    <style>
        .k-grid {
            width: 280px;
        }
    </style>
}

Controller 发票类别更新方法:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(IEnumerable<InvoiceCategory> invoiceCategory)
{
    if (ModelState.IsValid)
    {
        try
        {
            _context.InvoiceCategory.UpdateRange(invoiceCategory);
            _context.SaveChangesAsync();
        }
        catch (Exception ex)
        {
           ...
        }
    }
}

正在 View 中更改值,并将更改发送到 Controller 的 Edit 方法,但由于某种原因,更改不会通过 save 方法传播到数据库。

Entity Framework 是否可以不支持像我这样没有整数标识列的查找表?还是我做了一些愚蠢的事情?

最佳答案

本质上,您尝试执行的操作是更新名为 InvoiceCategory 的表的主键。无论如何,对于代码的上下文,如果您在数据库的上下文中考虑它,这是没有意义的。主键是记录的唯一标识符。您不应该能够更新它。

顺便说一句,每当您使用async时,您都应该至少使用一个await。否则你的方法将同步执行。在您的情况下,缺少的等待是这样的:

await _context.SaveChangesAsync();

更新

我认为您需要的是以下内容:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(IEnumerable<InvoiceCategory> invoiceCategories)
{
    if (ModelState.IsValid)
    {
        try
        {
            foreach(var invoiceCategory in invoiceCategories)
            {
                if(invoiceCategory.InvoiceCategoryID == 0)
                {
                    _context.InvoiceCategory.Add(invoiceCategory);    
                }
                else
                {
                    _context.InvoiceCategory.Update(invoiceCategory);
                }
            }
            await _context.SaveChangesAsync();
        }
        catch (Exception ex)
        {
           ...
        }
    }
}

关于c# - Entity Framework SaveChangesAsync 不更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46803282/

相关文章:

c# - 为 ViewModel 选择什么方法?

c# - OptimisticConcurrencyException:使用共享的AppFabric缓存和相同的数据库的多个基于EF的应用程序

c# - ASP.Net Core 3.0 依赖注入(inject)忽略工厂方法?

asp.net - Docker错误: dotnet-file. dll不存在

c# - 如何接收发布到 ASP.net core 2.1 Web-API 端点的文件和数据

c# - 如何将一个 "clone"对象转化为子类对象?

c# - .net 自定义配置部分元素是否必须具有键?

c# - 两个ListPicker,一个TextBox。结果未显示。主从?

entity-framework - 喜欢 and And 或者 ISNull 使用 Linq to Entity Entity Framework4?你是怎样做的?

c# - 使用EF通过id删除一条记录,如果id不存在则抛出异常