Как мне использовать Entity Framework с RootObject DTO?

#c# #json #sql-server #entity-framework #dto

#c# #json #sql-сервер #сущность-фреймворк #dto

Вопрос:

Я пытаюсь создать таблицу или таблицы с отображением через Entity Framework, однако у меня возникают проблемы с выполнением этого с файлом DTO, который я структурировал из API, который я использую.

Это используемый мной файл DTO, который я специально вставил из POSTMAN для данных JSON.

  public class AllRequests
 {
        public class Rootobject
        {
            public Operation operation { get; set; }
        }

        public class Operation
        {
            public Result result { get; set; }
            public Detail[] details { get; set; }
        }

        public class Result
        {
            public string message { get; set; }
            public string status { get; set; }
        }

        public class Detail
        {
            public string requester { get; set; }
            public string workorderid { get; set; }
            public string accountname { get; set; }
            public string createdby { get; set; }
            public string subject { get; set; }
            public string technician { get; set; }
            public string isoverdue { get; set; }
            public string duebytime { get; set; }
            public string priority { get; set; }
            public string createdtime { get; set; }
            public string ignorerequest { get; set; }
            public string status { get; set; }
        }
}
 

Как вы можете видеть выше, он довольно иерархичен, поэтому не так прост, как создание таблицы из простого файла класса.

Это мое DbContext досье:

 public class TransitionContext : DbContext
{
        private const string connectionString = (connection);

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(connectionString);
        }

        public DbSet<AllRequests> Requests { get; set; }
}
 

Я установил миграции, которые прошли нормально, есть подключение к моему SQL Server. Однако, когда я запускаю Update-Database команду в консоли PM, она не будет работать. Ошибки не являются прямыми, но они заставляют меня бегать по кругу, сначала устанавливается ключ идентификатора, затем это табличные отношения, но нет хорошего исходного материала о том, как это сделать.

Может ли кто-нибудь научить меня, как мне успешно реализовать этот DTO через Entity Framework на моем SQL Server? Я предполагаю, что это будет использование model creator, но я все еще не уверен, как этот процесс полностью работает в этом контексте.

Любая помощь будет признательна.

Комментарии:

1. Похоже, в нем действительно отсутствуют некоторые ключи…

2. Опубликуйте точное сообщение об ошибке … «это не сработает» … ну … не сработает. Поместите его в OP.

3. @KyleAT OP — это ты — оригинальный плакат. Вложите всю информацию в вопрос. I don't want to put too much information into the question. вы не указали достаточно информации. То, что вы опубликовали, не может быть отображено и фактически приведет к ошибкам во время выполнения в момент создания DbContext

4. @KyleAT что-то не так, но вы опубликовали недостаточно информации. EF не имеет дело с DTO API, он имеет дело с сущностями, таблицами и их отображением. То, что работает для API, не работает для классов приложений или таблиц базы данных. Это DbSet<AllRequests> бессмысленно, поскольку нет никаких отношений между вложенными классами и включающим классом. Это имело бы больше смысла, если AllRequests бы было пространством имен

5. first it's set an ID key, then it's table relationships, but there's no good source material on how to do it. напротив, каждый учебник посвящен этому. Причина, по которой так много ошибок, заключается в том, что нет конфигурации, нет отношений между классами, нет ID свойств. Никакие соглашения не могут быть использованы для определения ключей и отношений

Ответ №1:

Попробуйте использовать [NotMapped], как указано в сообщении об ошибке

    public class Operation
        {
            public Result result { get; set; }
            [NotMapped]
            public Detail[] details { get; set; }
        }
 

Если вам нужен этот массив…EF нужен способ навигации it..ie ключ.

Комментарии:

1. В этом DbContext нет ключей, нет отношений, нет конфигурации, в то время как единственный «сконфигурированный» класс, AllRequests , вообще ничего не содержит. Это всего лишь 1 проблема из десятков — нет даже DbSet<Operation>

2. @PanagiotisKanavos Как я уже говорил в OP, я использовал специальную вставку из POSTMAN из GET API. Этот DTO, который я использую, был создан на основе этого, и запросы GET работают, поэтому данные сохраняются в этом файле DTO. Который я затем надеюсь сопоставить и сохранить в таблице запросов. Я надеялся, что он сможет сгенерировать набор таблиц или иерархию таблиц из этого файла класса. Я объяснил эту часть.

3. @KyleAT: Самый простой способ сделать это — самостоятельно написать сопоставление из Operation DTO с объектами EF первого класса.

4. @KyleAT вы пытались сопоставить класс, который ничего не содержит — ни полей, ни свойств, ни отношения наследования к вложенным классам. Не имеет значения, откуда берутся эти классы. AllRequests просто пусто

5. @PanagiotisKanavos Я уже сопоставлял классы в Entity Framework только со стандартным классом C #, без данных или аннотаций EF, только с основным ключом идентификатора по умолчанию и множеством других ключей. Поэтому я подумал, что это будет так просто.