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

Я хочу отображать информацию о клиенте. Затем я создал несколько классов; «Клиент», «Доставка», «Заказ», «Строка заказа», «Продукт» и «Аренда БД». Класс 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; }
   }
}

person wholee1    schedule 18.02.2012    source источник


Ответы (2)


Чтобы использовать структуру сущностей, каждой сущности нужен ключ. Именно так 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; }
  }
}
person Michael Edenfield    schedule 18.02.2012
comment
Это сработало для меня в особом случае. Я добавил контроллер после написания кода для модели и не получил ошибку. В этот момент я понял, что модель не то, что мне нужно, что означает, что все сгенерированные представления были очень неправильными, поэтому я удалил контроллер/представления. Затем, когда я исправил модель и добавил контроллер, появилась ошибка. После часа возни я добавил [Ключ], и это сработало. Может визуальная студия Mvc странность или кеш, не знаю... - person isitdanny; 25.04.2014

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

person Beatles1692    schedule 18.02.2012