Получение данных из нескольких таблиц с использованием Entity Framework - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу получить данные из нескольких таблиц на основе itemId каждой таблицы.

В настоящее время у меня есть таблица элементов со столбцом ItemId, которая имеет отношение 1: m с другими таблицами, называемымиExplicitMods:

namespace Poe.Models
{
    public class Item
    {
        [Key]
        public string ItemId { get; set; }
        public List<ExplicitMod> ExplicitMods { get; set; }
    }
}

namespace Poe.Models
{
    public class ExplicitMod       
    {
        public ExplicitMod(string Name)
        {
            this.Name = Name;
        }

        [Key]
        public string ItemId { get; set; } 
        public string Name { get; set; }
    }
}

У меня также есть контекст с обоими настроенными таблицами:

namespace Poe.DataAccess
{
    public class DatabaseContext : DbContext
    {
        public DbSet<Item> Items { get; set; }
        public DbSet<ExplicitMod> ExplicitMod { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
        }
    }
}

Затем я пытаюсь вызвать таблицы элементов, найти случайное имя под названием "Brood"Пометьте звездочкой »и присоединитесь к таблице явления:

public static void Search()
{
    //return FindItems(i);
    using (var db = new DatabaseContext())
    {
        var blogs = db.Items
                    .Where(b => b.Name.Equals("Brood Star"))
                    .Include(es => es.ExplicitMods).ToList();
        Debug.Write(blogs);
    }
}

Что мне нужно сделать, чтобы получить результат в виде одной таблицы?

Я также получаю эту ошибку:

System.Data.SqlClient.SqlException: 'Неверное имя объекта' ExplicitMod '

1 Ответ

0 голосов
/ 21 ноября 2018

Ваши ссылки нуждаются в некоторой корректировке.Для 1-многих ваш ExplicitMod будет нуждаться в своем собственном PK и FK to Item:

public class ExplicitMod       
{
    public ExplicitMod()
    {}

    public ExplicitMod(string name)
    {
        Name = name;
    }

    [Key]
    public string ExplicitModId { get; set; } 
    [ForeignKey("Item")]
    public string ItemId{ get; set; }
    public string Name { get; set; }
    public virtual Item Item { get; set; }
}

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

Для элемента:

public class Item
{
   [Key]
    public string ItemId { get; set; }
    public virtual ICollection<ExplicitMod> ExplicitMods { get; private set; } = new List<ExplicitMod>();
}

При инициализации коллекции и использовании частного установщика рекомендуется сохранять шаги при создании новых сущностей для заполнения и при наличии внешнего кода, устанавливающего ссылку на коллекцию для новой,неотслеживаемый набор сущностей.(Для модульного тестирования я обычно помечаю сеттер как внутренний, чтобы позволить модульным тестам настроить заглушки)

Я бы настоятельно рекомендовал использовать int или Guid для полей PK / FK, а не для строк.Если вы хотите иметь уникальные идентифицирующие строки, добавьте их в качестве дополнительных столбцов / w уникальных ограничений.Использование цифровых или UUID-ключей является формой «бессмысленных ключей», которые экономят пространство индексации и упрощают изменение значений, не беспокоясь о случайном изменении / аннулировании отношений данных.

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