/ / “Броят на приетите стойности на първичния ключ трябва да бъдесъвпадат брой на стойностите на първичния ключ, дефинирани в субекта. Име на параметър: keyValues ​​”Entity Framework - c #, asp.net, sql-сървър, asp.net-mvc, субект-рамка

„Броят на приетите стойности на първичния ключ трябва да бъдесъвпадат брой на стойностите на първичния ключ, дефинирани в субекта Име на параметър: keyValues ​​”Entity Framework - c #, asp.net, sql-сървър, asp.net-mvc, субект-рамка

Така Iv използвах CRUD операциите с EntityРамка в моето приложение ASP.NET MVC. Направих формуляр за вход, при който всеки уникален потребител получава UserId и сега се опитвам да манипулирам тези CRUD операции, така че потребителят да може да редактира или изтрие записа на базата данни. Но продължавам да получавам грешката, както виждате в заглавието.

Мисля, че това е свързано с основните ми ключове, ето някакъв код:

Модел:

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; }
}

Изглед:

@model IEnumerable<Aviato.Models.TimesheetEntry>

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

<h2>Index</h2>

<p>
@Html.ActionLink("Create", "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("Edit", "Edit", new { id=item.UserId }) |
@Html.ActionLink("Details", "Details", new { id=item.UserId }) |
@Html.ActionLink("Delete", "Delete", new { id=item.UserId })
</td>
</tr>
}

</table>
<div>
@Html.ActionLink("Index", "Index", "User")
</div>

контролер:

public class TimesheetEntryController : Controller
{
private readonly AviatoModel _db = new AviatoModel(); //Database Model

public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

var timesheetentry = _db.TimesheetEntries.Find(id);

if (timesheetentry == null)
{
return HttpNotFound();
}

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

return View(timesheetentry);
}

[HttpPost]
public ActionResult Edit([Bind(Include="UserId,ProjectId,EntryDate,HoursWorked")] TimesheetEntry timesheetentry)
{
if (ModelState.IsValid)
{
_db.Entry(timesheetentry).State = System.Data.Entity.EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index");
}

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

return View(timesheetentry);
}
}

Таблица на базата данни:

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])
);

И така, как да позволя на потребителя да промени собствените си уникални данни в базата данни?

Моля помогнете.

Отговори:

2 за отговор № 1

Противоречивото твърдение е

var timesheetentry = _db.TimesheetEntries.Find(id);

Както правилно споменахте, тя има връзка с броя ключови полета. В случай на вашия модел трябва да минете три елемента Find().

Така че трябва

  1. Или предайте и трите елемента на вашия Edit() действие или
  2. Имайте уникален ключ само с една колона (т.е. ключ за отделен ключ - не е за предпочитане във вашия подход)

1 за отговор № 2

Като цяло, когато получите това изключение, това означава, че искате да намерите определено образувание чрез неговия първичен ключ (или група ключове).

Ако сте сигурни, че вашите параметри към метода .Find () е правилния брой първични ключове, проверете дали вашият модел edmx показва правилния брой първични ключове.

Ако вашият модел edmx е правилен, има само единдруго място, където ще бъде грешката, това е в самата база данни. Проверете вашата база данни и се уверете, че сте задали всички първични ключове в действителната таблица.

Ако таблицата на вашата база данни не посочва поле за първичен ключ, вашето edmx ще приеме, че всяко поле е ключово. Така че уверете се, че вашата база данни и моделът на вашата структура говорят едно и също.