Как запросить несколько таблиц в EF ASP. NET MVC? - PullRequest
0 голосов
/ 04 февраля 2020

У меня большая проблема для начинающих, я думаю! Я пытаюсь сделать ASP. NET MVC 5 Applikation, приложение должно хранить поставщиков в таблице базы данных, в отдельной таблице оно должно хранить SalesOrders. В представлении, когда я нажимаю на детали Поставщика, должны быть загружены все детали, но также и все SalesOrders, где для этого Поставщика также должна быть загружена. я пробовал этот способ безрезультатно.

ModelBase Содержит только идентификатор проп.

Классы

public class SalesOrder : ModelBase
{
    public string ordertitle { get; set; }
    public Supplier Supplier { get; set; }
}


public class Supplier : ModelBase
{
    public string CompanyName { get; set; }
    public string ContactPerson { get; set; }
    public string Phone { get; set; }
    public string Street { get; set; }
    public string Zip { get; set; }
    public string City { get; set; }
    public int Discount { get; set; }
}

ViewModel

public class SalesOrderViewModel
{
    public Supplier Supplier { get; set; }
    public List<SalesOrder> SalesOrder { get; set; }
}

Контроллер

public ActionResult SupplierSalesOrders(int id)
{
    var supplier = _context.Suppliers.Single(s => s.Id == id);
    var salesorder = _context.SalesOrders.ToList().Where(s => s.Supplier == supplier);

    SalesOrderViewModel viewModel = new SalesOrderViewModel
    {
        Supplier = supplier,
        SalesOrder = salesorder.ToList()
    };

    return View(viewModel);
}

Представление

@model NETwork.Models.SalesOrderViewModel


@foreach(var sales in Model)
{
    @Html.LabelFor(model => model.SalesOrder)
}

извините за последний вопрос.

Что я сделал не так?

С наилучшими пожеланиями

Ларс

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Ваша первая проблема заключается в том, что вы обычно запрашиваете по идентификатору

.Where(s => s.Supplier == supplier);

Выше не является идентификатором, это объект supplier

Одним из решений будет включение коллекции свойство навигации для SalesOrders в Supplier

public class Supplier : ModelBase
{
    public string CompanyName { get; set; }
    public string ContactPerson { get; set; }
    public string Phone { get; set; }
    public string Street { get; set; }
    public string Zip { get; set; }
    public string City { get; set; }
    public int Discount { get; set; }
    public ICollection<SalesOrder> SalesOrders { get; set; }
}

, которое затем позволяет

 var supplier = _context.Suppliers
                        .Include(x => SalesOrders)
                        .Single(s => s.Id == id);


 SalesOrderViewModel viewModel = new SalesOrderViewModel
 {
      Supplier = supplier,
      SalesOrder = supplier.SalesOrder
 };

Обратите внимание, что вышеприведенный viewModel , вероятно, не идеален. Это означает, что supplier будет естественно содержать все salesorders в этом воплощении, а SalesOrder = supplier.SalesOrder будет избыточным.

0 голосов
/ 04 февраля 2020

Вы можете добавить внешний ключ в класс SalesOrder для поставщика.

public class SalesOrder : ModelBase
{
    public string ordertitle { get; set; }

    [ForeignKey(nameof(Supplier))]
    public int SupplierId { get; set; }

    public Supplier Supplier { get; set; }
}

И вы можете добавить коллекцию заказов на продажу поставщикам.

public class Supplier : ModelBase
{
    public string CompanyName { get; set; }
    public string ContactPerson { get; set; }
    public string Phone { get; set; }
    public string Street { get; set; }
    public string Zip { get; set; }
    public string City { get; set; }
    public int Discount { get; set; }
    public ICollection<SalesOrder> SalesOrders { get; set; }
}

Затем, если вы хотите получить заказы на продажу от поставщика, вы можете использовать действие Include () при запросе поставщика.

var supplier = _context.Suppliers.Include(s => s.SalesOrders).Single(s => s.Id == id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...