C# Store update、insert或delete语句影响了实体框架中意外的行数(0)

C# Store update、insert或delete语句影响了实体框架中意外的行数(0),c#,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,因此,我正在构建一个时间表应用程序,用户可以在其中向数据库注册时间表。Iv'e使用实体框架进行CRUD操作,但每次我试图编辑一条记录时,我都会看到标题上的错误 下面是一些代码: 型号: namespace Aviato.Models { using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; pub

因此,我正在构建一个时间表应用程序,用户可以在其中向数据库注册时间表。Iv'e使用实体框架进行CRUD操作,但每次我试图编辑一条记录时,我都会看到标题上的错误

下面是一些代码:

型号:

namespace Aviato.Models
{
    using System;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    public partial class TimesheetEntry
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int UserId { get; set; }

        [Key]
        [Column(Order = 1)]
        [StringLength(50)]
        public string ProjectId { get; set; }

        [Key]
        [Column(Order = 2, TypeName = "date")]
        public DateTime EntryDate { get; set; }

        public decimal HoursWorked { get; set; }

        public virtual Project Project { get; set; }

        public virtual User User { get; set; }
    }
}
ViewModel(不知道我是否真的需要):

视图(索引):

数据库:

CREATE TABLE [dbo].[TimesheetEntries] (
    [UserId]      INT            NOT NULL,
    [ProjectId]   NVARCHAR (50)  NOT NULL,
    [EntryDate]   DATE           NOT NULL,
    [HoursWorked] DECIMAL (8, 1) CONSTRAINT [DF_TimesheetEntries_HoursWorked] DEFAULT ((0.0)) NOT NULL,
    CONSTRAINT [PK_TimesheetEntries] PRIMARY KEY CLUSTERED ([UserId] ASC, [ProjectId] ASC, [EntryDate] ASC),
    CONSTRAINT [FK_TimesheetEntries_Users] FOREIGN KEY ([UserId]) REFERENCES [dbo].[Users] ([UserId]),
    CONSTRAINT [FK_TimesheetEntries_Projects] FOREIGN KEY ([ProjectId]) REFERENCES [dbo].[Projects] ([ProjectId])
);

我认为您不能将UserId传递给Edit操作,您可以直接将TimesheetEntryModel传递给Edit操作

@model IEnumerable<Aviato.Models.TimesheetEntry>

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Tidrapportering</h1>

<p>
    @Html.ActionLink("Skapa ny", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.UserId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Project.ProjectName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.EntryDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.HoursWorked)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.UserId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Project.ProjectName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EntryDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.HoursWorked)
            </td>
            <td>
                @Html.ActionLink("Redigera", "Edit", new { id=item.UserId, item.ProjectId, item.EntryDate, item.HoursWorked }) |
                @Html.ActionLink("Ta bort", "Delete", new { id=item.UserId, item.ProjectId, item.EntryDate, item.HoursWorked })
            </td>
        </tr>
    }

</table>
<div>
    @Html.ActionLink("Tillbaka", "Index", "User")
</div>
@model Aviato.ViewModel.TimesheetEntryModel

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Redigera</h1>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true)

        @Html.HiddenFor(model => model.UserId)

        <div class="form-group">
            @Html.LabelFor(model => model.ProjectId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ProjectId, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ProjectId)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EntryDate, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EntryDate, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.EntryDate)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.HoursWorked, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.HoursWorked, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.HoursWorked)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Spara" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Tillbaka", "Index")
</div>
namespace Aviato.Controllers
{
 public class TimesheetEntryController : Controller
    {
        private readonly AviatoModel _db = new AviatoModel(); //Database Model.

        public ActionResult Index()
        {
            var userId = (int)Session["userId"];
            var timesheetentries = _db.TimesheetEntries.Where(t => t.UserId == userId).ToList();

            return View(timesheetentries);
        }

   public ActionResult Edit(int id, string projectId, decimal hoursWorked, string entryDate)
        {
            var timesheetEntryModel = new TimesheetEntryModel();

            timesheetEntryModel.UserId = id;
            timesheetEntryModel.ProjectId = projectId;
            timesheetEntryModel.EntryDate = entryDate;
            timesheetEntryModel.HoursWorked = hoursWorked;

            ViewBag.ProjectId = new SelectList(_db.Projects, "ProjectId", "ProjectName", timesheetEntryModel.ProjectId);
            ViewBag.UserId = new SelectList(_db.Users, "UserId", "SocialSecurityNumber", timesheetEntryModel.UserId);

            return View(timesheetEntryModel);
        }

        [HttpPost]
        public ActionResult Edit(TimesheetEntry timesheetentry)
        {
            _db.Entry(timesheetentry).State = EntityState.Modified;
            _db.SaveChanges();

            ViewBag.ProjectId = new SelectList(_db.Projects, "ProjectId", "ProjectName", timesheetentry.ProjectId);
            ViewBag.UserId = new SelectList(_db.Users, "UserId", "SocialSecurityNumber", timesheetentry.UserId);

            return RedirectToAction("Index");
        }
CREATE TABLE [dbo].[TimesheetEntries] (
    [UserId]      INT            NOT NULL,
    [ProjectId]   NVARCHAR (50)  NOT NULL,
    [EntryDate]   DATE           NOT NULL,
    [HoursWorked] DECIMAL (8, 1) CONSTRAINT [DF_TimesheetEntries_HoursWorked] DEFAULT ((0.0)) NOT NULL,
    CONSTRAINT [PK_TimesheetEntries] PRIMARY KEY CLUSTERED ([UserId] ASC, [ProjectId] ASC, [EntryDate] ASC),
    CONSTRAINT [FK_TimesheetEntries_Users] FOREIGN KEY ([UserId]) REFERENCES [dbo].[Users] ([UserId]),
    CONSTRAINT [FK_TimesheetEntries_Projects] FOREIGN KEY ([ProjectId]) REFERENCES [dbo].[Projects] ([ProjectId])
);