Получить связанные столбцы из таблицы FK в связанной таблице один на один - EF Core (2) - PullRequest
0 голосов
/ 11 июня 2018

Это должно быть довольно легко, но я немного борюсь.

Моя ситуация такова: у меня есть таблица (Commodity) с внешним ключом для другой таблицы (CommodityMaterial).В моей конечной точке GET я хочу получить все данные столбцов из Commodity, а также все столбцы из CommodityMaterial.

Я настроил его следующим образом:

    public class Commodity
    {
        public long CommodityID { get; set; }

        public long CommodityMaterialID { get; set; }

        public decimal? SpecficWeight { get; set; }

        public OmsCommodityMaterial OmsCommodityMaterial { get; set; }

        public ICollection<OmsCommodityMaterial> OmsCommodityMaterials { get; set; }
    }

Таблица внешнего ключа:

    public class CommodityMaterial 
    {
        public long? CommodityMaterialID { get; set; }

        public string Name { get; set; }

        public long? SortOrder { get; set; }

        public Commodity Commodity { get; set; }
    }

API FLUENT:

    modelBuilder.Entity<Commodity>(entity =>
            {
                entity.Property(e => e.CommodityID)
                    .HasColumnName("CommodityID")
                    .ValueGeneratedOnAdd();

                entity.Property(e => e.CommodityMaterialID)
                    .HasColumnName("CommodityMaterialID");

                entity.Property(e => e.SpecficWeight)
                    .HasColumnName("SpecficWeight")
                    .HasColumnType("decimal(18, 2)");

                entity.HasOne(a => a.OmsCommodityMaterial)
                    .WithOne(b => b.Commodity)
                    .HasForeignKey<Commodity>(b => b.CommodityMaterialID);
            });

Это создает правильную связь, CommodityMaterial (ID) необходим при создании товара.

Теперь я хочу получить все значения / столбцы таблицы Commodity, а также соответствующие столбцы таблицы CommodityMaterial (CommodityMaterialID, Name and SortOrder).После прочтения некоторых других сообщений, которые я обнаружил, что я должен / мог бы использовать Include для получения связанных данных, моя операция GET выглядит следующим образом:

    [HttpGet]
    public async Task<IEnumerable<Commodity>> GetTest()
    {
        return await Context.Commodity.Include(x => x.OmsCommodityMaterials).ToListAsync();
    }

Однако, это все еще возвращает только 3 столбца таблицы Commodity.(CommodityID, CommodityMaterialID, SpecficWeight)

Кто-нибудь знает, что я делаю неправильно?

РЕШЕНИЕ

Хорошо, мне немного стыдно, проблема заключалась в том, что я использовал аннотацию DataContract в своем классе Commodity POCO, которыйв приведенном выше коде было пропущено, в ссылке OmsCommodityMaterial отсутствовал атрибут DataMember, что делало его поля невидимыми ...

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Мне немного стыдно за это, проблема заключалась в том, что я использовал аннотацию DataContract в своем классе Commodity POCO, который был опущен в приведенном выше коде, ссылка OmsCommodityMaterial пропускала DataMember атрибут, что делает его поля невидимыми ...

0 голосов
/ 11 июня 2018

Хотя это и не ответ сам по себе, может быть, вы найдете его сами здесь .

Include()/ThenInclude() ( Eager loading) - одно из трех возможных решений.Я предлагаю вам изучить и другие два - Явный и Ленивый .

РЕДАКТИРОВАТЬ : Дальнейшее изучение вашего кода кажется немного странным дляиметь коллекцию сущностей в отношениях один к одному.Возможно, вы захотите использовать только класс и (это важно!) Указывать имена классов в < и > при вызове HasOne ().Если вы используете ReSharper или что-то подобное, такой инструмент предлагает упрощение имен, то есть избавление от явного указания типов при шаблонировании беглых методов.Это следующее особое место, когда EF придает немного другое значение известным функциям C #.Первый - это очень известные virtual с.

HTH

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