Проблема с ASP.NET MVC 5 Web Entity Framework - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над примерами лицензий MIT на веб-приложениях ASP.NET MVC и добавляю их в качестве публичных репозиториев github. Я также планирую иметь частные репозитории github для своих приложений, на которых планирую заработать в будущем.У меня есть учетная запись разработчика на github.com.

Я создал веб-приложение BOOKS MVC 5, используя скрипт TSQL, который мне предоставили во время предыдущего собеседования несколько лет назад, и использую GUID для полей идентификатора первичного ключа.со значением по умолчанию NEWID () вместо INT с IDENTITY решением является веб-приложение ASP.NET MVC 5 с базой данных Entity Framework.Я использую LocalDB для моего SQL Server с этим проектом, скрипт для создания и заполнения базы данных находится в моем репозитории SQL-Server и называется BOOKS_Create.sql

Я опубликовал решение для своего GitHub по следующему URL:

https://github.com/ABION-Technology/Books

Сценарии TSQL доступны в следующем репо:

https://github.com/ABION-Technology/SQL-Server

Я добавил ссылки на общий вид макета впоказать индексное представление для всех авторов в базе данных, а также ссылки на индексные представления для моделей TITLE и SALE EF.

Ссылка AUTHORS работает отлично и перечисляет всех авторов в базе данных.Но когда я щелкаю ссылку TITLES, я получаю исключение SQL для недопустимого имени столбца Author_ID, я выполнил поиск по всему решению и не нашел никакой переменной с именем Author_ID и не нашел класс C # со свойством под названием'Author_ID ". Так что эта проблема меня очень запутала, и, похоже, это не лучший способ отладки этой проблемы. Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

EF будет следовать некоторым соглашениям по умолчанию для разработки отношений FK.Ошибка, которую вы видите, связана с тем, что Author имеет коллекцию Titles, а EF пытается автоматически установить 1-ко-многим между двумя.Он ожидает найти «Author_ID» в Заголовке, который не существует, потому что ваша схема настроена с помощью объединяющей таблицы с именем TitleAuthor.

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

public class TitleAuthor
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; internal set;}
    public virtual Title Title { get; internal set;}
    public virtual Author Author { get; internal set;}
    // add other properties as needed..
}

Итак, от вашей сущности Author:

public virtual ICollection<TitleAuthor> Authors {get; internal set;} = new List<TitleAuthor>();

Чтобы получить доступ к заголовкам для автора:

author.Titles.Select(x => x.Title);

Я бы порекомендовал прочесть о сопоставлении многие ко многим с EF.Я всегда использую преднамеренное отображение с EF, а не полагаюсь на его соглашения.Это просто помогает сделать его более предсказуемым.

Если вы используете значения по умолчанию для PK, вам нужно сообщить EF через атрибут DatabaseGenerated.Это не требуется для операций чтения, но будет необходимо при вставке записей.

Кроме того, для SQL Server рассмотрите возможность использования NewSequentialId() в качестве значения по умолчанию для ваших UUID PK.Они более дружественны к индексам, чем NewId().

. Приведенный выше пример использования внутренних сеттеров (тоже для частных работ) для поощрения использования сущностей в стиле DDD.Публичные сеттеры могут привести к злоупотреблению / злоупотреблению сущностями в том смысле, что контекст будет старательно пытаться сохранить все, что вы установили.Как правило, рекомендуется ограничить функциональность, которая будет изменять состояние объекта, методом в объекте с необходимыми аргументами для проверки или хранилищем.Я использую внутреннюю область видимости, чтобы позволить модульным тестам по-прежнему инициализировать объекты.(используя InternalsVisibleTo между доменом и сборочными единицами)

0 голосов
/ 19 декабря 2018

Причина в том, что вы получаете ошибку идентификатора автора, у вас есть список титулов в классе авторов.Тогда между сущностями Author и Title должны быть отношения, которых нет в вашем контексте данных.Комментарий общественности virtual ICollection<Title> Titles { get; set; }.И это должно работать.

Причина, по которой вы не можете найти этот атрибут, заключается в том, что он автоматически создается структурой сущностей.(TableName_PrimaryKey)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...