C# 主键mvc实体框架模型错误

C# 主键mvc实体框架模型错误,c#,sql,asp.net-mvc,entity-framework,ef-database-first,C#,Sql,Asp.net Mvc,Entity Framework,Ef Database First,这个快把我逼疯了 我有一个包含多个列和一个主键(bigint,而不是null)的表 我已经创建了一个模型 public long ParcelRangeID { get; set; } .. .. 然后创建控制器和视图。当我使用Create视图创建新记录时,在db.SaveChanges上,问题开始:(我已将该字段作为HiddenFor包含在视图中) 没有进一步的变化;我得到的所需ID丢失错误。(当我使用DataAnnotations[Key],[DatabaseGeneratedAttri

这个快把我逼疯了

我有一个包含多个列和一个主键(bigint,而不是null)的表

我已经创建了一个模型

public long ParcelRangeID { get; set; }
..
..
然后创建控制器和视图。当我使用Create视图创建新记录时,在db.SaveChanges上,问题开始:(我已将该字段作为HiddenFor包含在视图中)

  • 没有进一步的变化;我得到的所需ID丢失错误。(当我使用DataAnnotations
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [HiddenInput(DisplayValue=false)]
  • 当我使用
    [Bind(Exclude=“ParcelRangeID”)]
    时,我得到了DbUpdateConcurrencyException
如何插入新记录并自动生成所需的ID而不出现错误

编辑

以下是控制器代码:

    [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create(ParcelRange parcelrange)
            {
                if (ModelState.IsValid)
                {
                    db.ParcelRange.Add(parcelrange);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }

                return View(parcelrange);
            }
模型:

 public partial class ParcelRange
    {
        public ParcelRange()
        {
            this.PickupAddressID = -1;
            this.OrganizationID = -1;
            this.DepotID = -1;
            this.IsVTG = 0;
            this.IsInternal = 0;
            this.IsInterCompany = 0;
            this.UpdateCount = 0;
            this.IsActive = 1;
            this.Modified = DateTime.Now.Date;
            this.Created = DateTime.Now.Date;
            this.ValidFrom = DateTime.Now.Date;
            this.ValidTo = DateTime.MaxValue;
        }

        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        [Key]
        [HiddenInput(DisplayValue = false)]
        public long ParcelRangeID { get; set; }
        public long NdswCustomerID { get; set; }
        public long PickupAddressID { get; set; }
        public long OrganizationID { get; set; }
        public long DepotID { get; set; }
        public string ParcelRangePrefix { get; set; }
        public string ParcelNumberStart { get; set; }
        public string ParcelNumberEnd { get; set; }
        public byte IsVTG { get; set; }
        public byte IsInternal { get; set; }
        public byte IsInterCompany { get; set; }
        public byte[] RowVer { get; set; }
        public System.DateTime Created { get; set; }
        public System.DateTime Modified { get; set; }
        public int UpdateCount { get; set; }
        public System.DateTime ValidFrom { get; set; }
        public System.DateTime ValidTo { get; set; }
        public byte IsActive { get; set; }
    }
编辑(2)

最后是自动生成的(默认)视图

@model MvcApplication1.ParcelRange

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.ParcelRangeID)

    <fieldset>
        <legend>ParcelRange</legend>

        <div class="editor-label">

            @Html.LabelFor(model => model.NdswCustomerID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.NdswCustomerID)
            @Html.ValidationMessageFor(model => model.NdswCustomerID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.PickupAddressID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PickupAddressID)
            @Html.ValidationMessageFor(model => model.PickupAddressID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.OrganizationID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OrganizationID)
            @Html.ValidationMessageFor(model => model.OrganizationID)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.DepotID)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.DepotID)
            @Html.ValidationMessageFor(model => model.DepotID)
        </div>

@*        <div class="editor-label">
            @Html.LabelFor(model => model.ParcelRangePrefix)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ParcelRangePrefix)
            @Html.ValidationMessageFor(model => model.ParcelRangePrefix)
        </div>*@

        <div class="editor-label">
            @Html.LabelFor(model => model.ParcelNumberStart)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ParcelNumberStart)
            @Html.ValidationMessageFor(model => model.ParcelNumberStart)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ParcelNumberEnd)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ParcelNumberEnd)
            @Html.ValidationMessageFor(model => model.ParcelNumberEnd)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.IsVTG)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.IsVTG)
            @Html.ValidationMessageFor(model => model.IsVTG)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.IsInternal)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.IsInternal)
            @Html.ValidationMessageFor(model => model.IsInternal)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.IsInterCompany)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.IsInterCompany)
            @Html.ValidationMessageFor(model => model.IsInterCompany)
        </div>

@*        <div class="editor-label">
            @Html.LabelFor(model => model.Created)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Created)
            @Html.ValidationMessageFor(model => model.Created)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Modified)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Modified)
            @Html.ValidationMessageFor(model => model.Modified)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.UpdateCount)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UpdateCount)
            @Html.ValidationMessageFor(model => model.UpdateCount)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ValidFrom)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ValidFrom)
            @Html.ValidationMessageFor(model => model.ValidFrom)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ValidTo)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ValidTo)
            @Html.ValidationMessageFor(model => model.ValidTo)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.IsActive)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.IsActive)
            @Html.ValidationMessageFor(model => model.IsActive)
        </div>*@

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
编辑(4)

我正在使用Entity Framework 5.0,将尝试更新到更高版本

编辑(5) 更新至EF 6.1,相同问题 这是我的连接字符串:

metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=XXX.XXX.XXX.XXX\DEV;initial catalog=DPDCDB_ODS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient
“(我已将视图中的字段包含为HiddenFor)”

由于它是数据库生成的主键,因此在
create
视图中,它没有初始值,您不应该使用
HiddenFor
来保存该属性。只需删除该
HiddenFor

如果使用脚手架向导创建EF控制器,则应注意,
create
视图中从不存在主键

更新:
我获取了提供的表脚本,创建了一个数据库,将其导出到Azure,创建了一个VS 2013 MVC web应用程序,然后为表创建了基于EF模型的控制器和视图。然后我将其发布到Azure,它运行得很好(做得好,Microsoft,让我们看看有人在5分钟内使用Amazon S3做到这一点!):)。我怀疑它是您的某个库的版本(可能是EF版本)。否则,这可能是web应用程序上其他数据库活动的副作用。

当我向我们的DBA提出这个问题时,他立即为我指出了正确的方向

此特定表上有触发器…..这些触发器导致DBUpdateConcurrencyException。我们禁用了这些触发器,插入进行得很顺利

我们现在必须了解如何模仿C#中的触发器,或者使用STP使用EF更新/插入记录


谢谢你的支持

你能发布你的控制器代码吗?或者调用db.SaveChanges()的部分?发布整个ParcelRange模型。是否可以发布视图代码?我觉得模型绑定没有正确完成。StoreGeneratedPattern:Identity。从数据库更新我已经尝试过好几次了。刚才尝试过了,结果在db.SaveChanges()上出现了DBUpdateConcurrencyException;(删除了HiddenFor btw的完整代码行)对于一个干净的项目,只有我创建了一个新控制器和视图的模型(ParcelRangeClass)(下一个完成)和agian,还有DBUpdateConcurrencyException。备注:该类有一些字段表示一些计算字段(DateTime由数据库插入),并且数据库中有一些约束(默认值),因此我在ParcelRange类构造函数中添加了默认部分作为测试。@Rob Joosen:我已获取了您的表,创建了一个数据库(在Azure上),创建了一个新的MVC项目,一个带有视图和
create
的EF模型运行良好。你用的是什么版本的EF?有多酷。。。我现在没有可用的环境,但明天(CET)将检查。非常感谢您的努力!
metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=XXX.XXX.XXX.XXX\DEV;initial catalog=DPDCDB_ODS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient