Как использовать EF6 с базой данных First и существующими представлениями?

c# entity-framework-6

Вопрос

Я EF noob (любая версия), и мой Google-foo не помог мне узнать, как это сделать. Это заставляет меня думать, что я должен делать это неправильно, но вот ситуация:

Я определенно в среде, которая сначала является базой данных, а схема не будет обновляться нами кодами. Я также не поклонник создания «автоматического» кода, поэтому я остался в стороне от дизайнера или EF powertools (хотя я пропустил их, чтобы увидеть, как они работают).

Чтобы узнать, я импортировал DB Northwind в свой LocalDB, чтобы иметь возможность играть с созданием некоторых простых конечных точек Web API 2. Это все пошло хорошо, поскольку я создал уменьшенные модели таблиц «Сотрудники, транспортники» и «Регион» в Нортвинде. Регион был особенно интересен, поскольку он не был множественным, и у EF были проблемы с этим. Во всяком случае, я понял.

Моя проблема сейчас; Я хочу использовать представление вместо таблицы в качестве источника, и все, что я делаю, похоже, не работает. Я попытался настроить его так же, как и таблицы. Но это создает ошибку ModelValidationException . Я пробовал смотреть на автогенерированный код от дизайнера, но не понял.

Мои модели:

//-- employee, shipper, & region work as expected
public class employee {
    public int EmployeeID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class shipper {
    public int ShipperID { get; set; }
    public string CompanyName { get; set; }
    public string Phone { get; set; }
}

public class region {
    public int RegionID { get; set; }
    public string RegionDescription { get; set; }
}

//-- invoice is a view (actual viewname is 'Invoices')
//-- so i followed the same rules as i did for employee & shipper
//-- i have tried uppercase 'I' as well as a plural version of the model
public class invoice {
    public string CustomerID { get; set; }
    public string CustomerName { get; set; }
    public string Salesperson { get; set; }
    public int OrderID { get; set; }
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

Мой контекст выглядит так:

//-- employee, shipper, & region work as expected
public class employee {
    public int EmployeeID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class shipper {
    public int ShipperID { get; set; }
    public string CompanyName { get; set; }
    public string Phone { get; set; }
}

public class region {
    public int RegionID { get; set; }
    public string RegionDescription { get; set; }
}

//-- invoice is a view (actual viewname is 'Invoices')
//-- so i followed the same rules as i did for employee & shipper
//-- i have tried uppercase 'I' as well as a plural version of the model
public class invoice {
    public string CustomerID { get; set; }
    public string CustomerName { get; set; }
    public string Salesperson { get; set; }
    public int OrderID { get; set; }
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

Если я прокомментирую public DbSet<Invoice> Invoices { get; set; } в контексте все работает. Просто при наличии строки (даже если я не ModelValidationException на ModelValidationException ), я получаю ошибку ModelValidationException при любом использовании контекста.

Может ли кто-нибудь сказать мне, что я здесь делаю неправильно? Благодарю.

Обновление: я пробовал это в одном из моих контроллеров, но я слишком нелюбив, чтобы знать, правильно ли это, хотя он работал до получения записей.

//-- employee, shipper, & region work as expected
public class employee {
    public int EmployeeID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class shipper {
    public int ShipperID { get; set; }
    public string CompanyName { get; set; }
    public string Phone { get; set; }
}

public class region {
    public int RegionID { get; set; }
    public string RegionDescription { get; set; }
}

//-- invoice is a view (actual viewname is 'Invoices')
//-- so i followed the same rules as i did for employee & shipper
//-- i have tried uppercase 'I' as well as a plural version of the model
public class invoice {
    public string CustomerID { get; set; }
    public string CustomerName { get; set; }
    public string Salesperson { get; set; }
    public int OrderID { get; set; }
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

Принятый ответ

Соглашения первого кода будут искать свойство ID или InvoiceID для использования в качестве ключа. Модель вашего Invoice имеет ни того, ни другого. Это конкретная причина, по которой ваш код не работает.

Менее конкретным является то, что у вас не может быть объектов в EF, у которых нет уникального ключа. Если вы можете, определите ключ. В противном случае вы все равно сможете решить проблему .




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему