Bezdepbonusu7Программирование: статьи и ответы

Вопрос

ASP.NET MVC 3 EntityType не имеет определенного ключа

Автор вопроса: wholee1Ответов: 2

Я хочу отображать информацию о клиенте. Затем я создал несколько классов; "Клиент", "Доставка", "Заказ", "Строка заказа", "Продукт" и "Аренда БД". Класс RentalDB устанавливает 5 DbSet из Product, Customer, Order, OrderLine и Delivery. Когда я создаю UserController с представлением списка, я не могу отобразить информацию о клиенте и возникают ошибки:

One or more validation errors were detected during model generation:
System.Data.Edm.EdmEntityType: : EntityType 'OrderLine' has no key defined. Define the key for this EntityType.
System.Data.Edm.EdmEntityType: : EntityType 'Delivery' has no key defined. Define the key for this EntityType.
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �OrderLine� is based on type �OrderLine� that has no keys defined.
System.Data.Edm.EdmEntitySet: EntityType: EntitySet �Delivery� is based on type �Delivery� that has no keys defined.

Я не знаю, почему эти объекты требуют ключа? Я понятия не имею об этой ошибке. Не могли бы вы мне помочь?

--UserController.cs--

namespace MvcApplication2.Controllers
{
public class UserController : Controller
  {
    //
    // GET: /User/
    rentalDB _db = new rentalDB();

    public ActionResult Index()
    {
        var model = _db.Customer;
        return View(model);
    }
  }
}

--Delivery.cs в папке Models--

namespace MvcApplication2.Models
{
  public class Delivery
  {
    public int trackId { get; set; }
    public String address { get; set; }
    public String postCode { get; set; }
    public decimal deliveryPrice { get; set; }
    public DateTime deliveryDate { get; set; }
    public DateTime returnDate { get; set; }
  }
}

--OrderLine.cs в папке Models--

namespace MvcApplication2.Models
{
   public class OrderLine
   {
    public int basketId { get; set; }
    public int productId { get; set; }
    public int quantity { get; set; }
   }
}

entity

Ответы

Ответ 1 · рейтинг 18 · Michael Edenfield

Чтобы использовать структуру сущностей, каждой сущности нужен ключ. Именно так EF отслеживает объекты в своем кэше, отправляет обновления обратно в базовое хранилище данных и связывает связанные объекты вместе.

У ваших объектов уже есть ключи, нужно только сообщить о них EF:

namespace MvcApplication2.Models
{
  public class Delivery
  {
    [Key] public int trackId { get; set; }
    public String address { get; set; }
    public String postCode { get; set; }
    public decimal deliveryPrice { get; set; }
    public DateTime deliveryDate { get; set; }
    public DateTime returnDate { get; set; }
  }
}

Ответ 2 · Beatles1692

Когда вы используете фреймворк ORM (объектно-реляционный преобразователь), такой как NHibernate или фреймворк Entity, который помогает вам сопоставлять реляционную базу данных с объектной моделью, вам нужно что-то, что позволит вам установить осмысленную связь между вашими объектами в памяти и строками данных в вашей памяти. база данных, и эта вещь является ключом (идентификатор, как его называет NHibernate), и обычно это естественный способ, которым СУРБД отслеживает записи с использованием первичного ключа (обычно вы используете первичный ключ БД в качестве ключа вашего объекта). Когда вы проверяете, есть ли два объекта равны, используя оператор ==, вы проверяете, что эти объекты имеют одинаковую ссылку (или адрес в памяти). Этот вид равенства не очень полезен, когда вы используете ORM. Вы можете загрузить несколько экземпляров записи в память с разными ссылками, чтобы невозможно было проверить равенство объектов по их ссылкам. Это когда проверка равенства по значению входит в игра и ключи играют главную роль в этой игре.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы