ASP. NET Core & Entity Framework Core: свойства отношения один-ко-многим и свойства навигации - PullRequest
0 голосов
/ 16 марта 2020

Я использую ASP. NET Core и Entity Framework Core и API контроллера для соединения с моей базой данных приложения реакции.

У меня есть 4 класса Customer, Product, Store и Sales. Таблицы Customer, Product и Store имеют отношение «один ко многим» с продажами.

Here is the image of database relation which I am trying to implement

Класс продаж

public class Sales
{
    [Key]
    public int SalesId { get; set; }
    public int ProductId { get; set; }
    public int CustomerId { get; set; }
    public int StoreId { get; set; }
    [DataType(DataType.Date)]
    public string DateSold { get; set; }

    public Product Product { get; set; }
    public Customer Customer { get; set; }
    public Store Store { get; set; }
}

Класс клиента

public class Customer
{
    [Key]
    public int CustomerId { get; set; }
    [Column(TypeName = "nvarchar(100)")]
    public string Name { get; set; }
    [Column(TypeName = "nvarchar(100)")]
    public string Address { get; set; }

    public IList<Sales> Sales { get; set; }
}

Остальные продукт и магазин соответствуют классу клиента.

Я запускаю команду переноса, но база данных не была создана, и команда выполняется успешно, поэтому я создал базу данных, а затем запускаю update-database, которая создала все таблицы в базе данных.

Если я добавлю Свойства навигации по таблице приведут к получению записи о продажах с записями о клиентах, продуктах и ​​магазинах согласно идентификатору в записи о продажах.

Я хочу получить запись о продажах, а в таблице продаж есть идентификатор клиента, продукта и магазина. Как я могу получить их записи?

Мои таблицы выглядят так:

My database diagram

1 Ответ

1 голос
/ 17 марта 2020

Я хочу получить запись о продажах, и в таблице продаж есть идентификатор клиента, продукта и магазина. Как я могу получить их записи?

Основываясь на дизайне вашей модели, вы можете использовать Include метод для загрузки связанных данных, как показано ниже:

Контроллер

    [HttpGet]
    public async Task<ActionResult<object>> GetSales() 
    {
        var salesdata = await _context.Sales
                    .Include(s => s.Customer)
                    .Include(s => s.Product)
                    .Include(s => s.Store)
                    .Select(s => new
                    {
                        salesId = s.SalesId,
                        dateSold = s.DateSold,
                        customer = new
                        {
                            name = s.Customer.Name,
                            address = s.Customer.Address
                        },
                        product = new
                        {
                            name = s.Product.Name,
                            price = s.Product.Price
                        },
                        store = new
                        {
                            name = s.Store.Name,
                            address = s.Store.Address
                        }
                    })
                    .ToListAsync();
        return salesdata; 
    }

Для синтаксиса запроса вы можете использовать Join в EF Core для сложных операторов запросов

var data = from s in _context.Sales
                   join cu in _context.Customer on s.CustomerId equals cu.CustomerId 
                   join p in _context.Product on s.ProductId equals p.ProductId 
                   join st in _context.Store on s.StoreId equals st.StoreId 
                   select new
                   {
                       salesId = s.SalesId,
                       dateSold = s.DateSold,
                       customer = new
                       {
                           name = s.Customer.Name,
                           address = s.Customer.Address
                       },
                       product = new
                       {
                           name = s.Product.Name,
                           price = s.Product.Price
                       },
                       store = new
                       {
                           name = s.Store.Name,
                           address = s.Store.Address
                       }
                   };
        return await data.ToListAsync();     

Результат enter image description here

...