Количество передаваемых значений первичного ключа должно совпадать с количеством значений первичного ключа, определенных в сущности
Я создал представление в SQL Server, которое содержит наиболее важные столбцы из разных таблиц. Вывод содержимого таблицы на печать ASP.NET MVC view работает нормально, но когда я хочу получить детали одной записи, возникает проблема.
Число передаваемых значений первичного ключа должно совпадать с числом значений первичного ключа, определенных в сущности.
Я перехожу к конкретной записи, делая это:
@Html.ActionLink("Details", "Details", new { id=item.Record_number })
Номер записи-это первичный ключ. Я это делается вручную, щелкнув правой кнопкой мыши на конкретной переменной в модели .edmx
. Затем я пытаюсь получить конкретные данные, используя следующее:
//
// GET: /Record/Details/5
public ActionResult Details(int id = 0)
{
try
{
RecordDataView record = db.RecordDataView.Find(id); //HERE THE ERROR OCCUR
if (record == null)
{
return HttpNotFound();
}
return View(record);
}
catch(EntityException)
{
return RedirectToAction("NoDatabaseConnection", "Home");
}
}
А модель выглядит так:
namespace Implant.Database
{
using System;
using System.Collections.Generic;
public partial class RecordDataView
{
public int Record_number { get; set; }
public Nullable<System.DateTime> DOB { get; set; }
public Nullable<System.DateTime> Record_date { get; set; }
/** rest of code omitted */
}
}
В данный момент я использую следующий код, чтобы заставить все это работать. Но я не думаю, что это очень хороший способ или эффективный. И мне очень любопытно, как исправить неисправность выше!
//
// GET: /Record/Details/5
public ActionResult Details(int id = 0)
{
var record = from r in db.RecordDataView
select r;
if (id != 0)
{
record = record.Where(r => r.Record_number == id);
}
RecordDataView rec = record.ToList().First();
return View(rec);
}
У кого-нибудь есть идея, почему возникает эта ошибка? Спасибо за помощь!
2 ответа:
Если вы задаете свой первичный ключ в
.edmx
, вы также должны обновить свою базу данных, потому что у вас есть PK в вашей модели, а не в вашей базе данных. Update: не работает для представлений.Для представлений используйте
.SingleOrDefault
вместоFind()
.В этом сценарии измените следующую строку:
RecordDataView record = db.RecordDataView.Find(id);
К следующему:RecordDataView recorddataview = db.RecordDataView.SingleOrDefault(m => m.Record_number == id);
Если в таблице базы данных не указано поле первичного ключа, модель edmx предполагает, что каждое поле является ключом. Поэтому убедитесь, что ваша база данных и ваша модель сущности говорят одно и то же.
Если ваша модель и база данных правильно указывают первичный ключ, то, вы можете использовать .Найдите () и это сработает.