ddgjgj Ответов: 0

Отношения многие ко многим в представлении MVC


Вот такой вид :

@model Northwind.Employee

@{
    ViewBag.Title = "Details";
    Layout = "~/Views/Shared/MasterDetailsLayoutPage.cshtml";
}

<h2>Details</h2>

<div>
    <h4>Employee</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.LastName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.LastName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.FirstName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.FirstName)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.TitleOfCourtesy)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.TitleOfCourtesy)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.BirthDate)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.BirthDate)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.HireDate)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.HireDate)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Address)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Address)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.City)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.City)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Region)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Region)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.PostalCode)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.PostalCode)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Country)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Country)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.HomePhone)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.HomePhone)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Extension)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Extension)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Photo)
        </dt>

        <dd>
            @{

                byte[] photo = Model.Photo;
                string imageSrc = "image / jpeg";
                if (photo != null)
                {

                    MemoryStream ms = new MemoryStream();
                    ms.Write(photo, 78, photo.Length - 78);
                    string imageBase64 = Convert.ToBase64String(ms.ToArray());
                    imageSrc = string.Format("data:image/jpeg;base64,{0}", imageBase64);


                }
            }

            <img src="@imageSrc" alt="Image"  width="50" height="50"/>
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Notes)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Notes)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.PhotoPath)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.PhotoPath)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Employee1.LastName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Employee1.LastName)
        </dd>

    </dl>
</div>


<h4>Customers  </h4>
<p>
    @Html.ActionLink("Create New Customer", "Create", "Customers", new { id = Model.EmployeeID }, null)
</p>
<table class="table">
    <tr>

        <th>
            Customer ID
        </th>
        <th>
            Customer Name
        </th>
        <th>
            Order  ID
        </th>

        <th></th>
    </tr>
    
    @foreach (var item in Model.Orders)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.CustomerID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Customer.ContactName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.OrderID)
            </td>
          

            <td>
                @Html.ActionLink("Editt   ", "Edit", "Customers", new { id = item.CustomerID }, null)


                @Html.ActionLink("Detailss     ", "Details", "Customers", new { id = item.CustomerID }, null)


                @Html.ActionLink("Deletee    ", "Delete", "Customers", new { id = item.CustomerID }, null)


                @Html.ActionLink("Edit", "Edit", new { id = item.CustomerID }) |
                @Html.ActionLink("Details", "Details", new { id = item.CustomerID }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.CustomerID })
            </td>
        </tr>
    }

</table>







<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.EmployeeID }) |
    @Html.ActionLink("Back to List", "Index")
</p>



А это контролер :

// GET: Employees/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Employee employee = db.Employees.Find(id);
            if (employee == null)
            {
                return HttpNotFound();
            }
            return View(employee);
        }



Это класс сотрудников, класс клиентов и класс заказов :

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Northwind
{
    using System;
    using System.Collections.Generic;
    
    public partial class Order
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Order()
        {
            this.Order_Details = new HashSet<Order_Detail>();
        }
    
        public int OrderID { get; set; }
        public string CustomerID { get; set; }
        public Nullable<int> EmployeeID { get; set; }
        public Nullable<System.DateTime> OrderDate { get; set; }
        public Nullable<System.DateTime> RequiredDate { get; set; }
        public Nullable<System.DateTime> ShippedDate { get; set; }
        public Nullable<int> ShipVia { get; set; }
        public Nullable<decimal> Freight { get; set; }
        public string ShipName { get; set; }
        public string ShipAddress { get; set; }
        public string ShipCity { get; set; }
        public string ShipRegion { get; set; }
        public string ShipPostalCode { get; set; }
        public string ShipCountry { get; set; }
    
        public virtual Customer Customer { get; set; }
        public virtual Employee Employee { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Order_Detail> Order_Details { get; set; }
        public virtual Shipper Shipper { get; set; }
    }
}







//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Northwind
{
    using System;
    using System.Collections.Generic;
    
    public partial class Employee
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Employee()
        {
            this.Employees1 = new HashSet<Employee>();
            this.Orders = new HashSet<Order>();
            this.Territories = new HashSet<Territory>();
            this.Customers = new HashSet<Customer>();

        }

        public int EmployeeID { get; set; }

        public string LastName { get; set; }
        public string FirstName { get; set; }
        public string Title { get; set; }
        public string TitleOfCourtesy { get; set; }
        public Nullable<System.DateTime> BirthDate { get; set; }
        public Nullable<System.DateTime> HireDate { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Region { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string HomePhone { get; set; }
        public string Extension { get; set; }
        public byte[] Photo { get; set; }
        public string Notes { get; set; }
        public Nullable<int> ReportsTo { get; set; }
        public string PhotoPath { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Employee> Employees1 { get; set; }
        public virtual ICollection<Customer> Customers { get; set; }


        public virtual Employee Employee1 { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Order> Orders { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Territory> Territories { get; set; }
    }
}








//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Northwind
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;

    public partial class Customer
    {
      //  internal static readonly object ContactName;

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Customer()
        {
            this.Orders = new HashSet<Order>();
            this.CustomerDemographics = new HashSet<CustomerDemographic>();
        }

        public string CustomerID { get; set; }

        public int EmployeeID { get; set; }

        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string ContactTitle { get; set; }
        public string Address { get; set; }
        public string City { get; set; }

        //     [StringLength(15, MinimumLength = 3, ErrorMessage = "Invalid")]
        //  [MaxLength(15), MinLength(5)]
       

        //  public virtual Shipper Shipper { get; set; }


        public string Region { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
        public string Fax { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Order> Orders { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<CustomerDemographic> CustomerDemographics { get; set; }

     //   [NotMapped]
       // public virtual Region Regionn { get; set; }
       public virtual Region Regionn { get; set; }
        public Nullable<int> RegionVia { get; set; }

        public virtual Employee Employee { get; set; }

        //    public string Region { get; set; }
        //  [NotMapped]
        //   public List<Region> RegionList { get; set; }

        //public Region Regionn { get; set; } // Navigation Property  

        //[NotMapped]
        //  public string RegionID { get; set; }

        //  [NotMapped]
        //     public List<Region> RegionList { get; set; }

        //   public int RegionID { get; set; }





    }
}



Итак, у меня есть три таблицы базы данных Northwind, Employee (employeeID) 1- * Order (Orderid, customerid, employeeid) * - 1 Customer (customerID). Таким образом, это отношения «многие ко многим»: у 1 сотрудника много заказов, а у 1 клиента много заказов, так что это отношение 1 * * 1 с таблицей заказов посередине. В представлении сведений перечислены все сведения о конкретном сотруднике на основе идентификатора в URL-адресе, а под ним отображается таблица ВСЕХ ЕГО КЛИЕНТОВ. Итак, поскольку класс сотрудника не имеет прямого отношения к классу клиентов, между ними существует взаимосвязь «многие ко многим»: у сотрудника много заказов, а у клиента много заказов. Итак, как мне извлечь и отобразить в представлении всех отдельных клиентов каждого сотрудника. Я использую Entity framework, и мои объекты выглядят следующим образом:

namespace Northwind.Controllers
{
    public class EmployeesController : Controller
    {
        private dbNorthwindEntities db = new dbNorthwindEntities();


Что я уже пробовал:

Я попробовал это :

@foreach (var item in Model.Orders)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.CustomerID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Customer.ContactName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.OrderID)
            </td>



Он работает, но загружается очень медленно, и мне нужен другой способ сделать это.

CHill60

Где находится код, который фактически считывает данные из базы данных?

ddgjgj

пространство имен "Борей".Контроллеры
{
public class EmployeesController : контроллер
{
частные dbNorthwindEntities db = новые dbNorthwindEntities();

// Вам: человек
индекс public ActionResult()
{
ВАР человек = дБ.Человек;
/ в / var человек = дБ.Сотрудников.Включает(е =&ГТ; электронная.Employee1).Включает(е =&ГТ; электронная.Сотрудников1);
/ в / var человек = дБ.Сотрудников.Включает(е =&ГТ; электронная.Сотрудников1);

/ в / var человек = дБ.Сотрудников.Включает(е =&ГТ; электронная.Employee1);

обратный вид(сотрудники.Список());
}



// GET: Employees / Details / 5
public ActionResult Details(int? id)
{
if (id = = null)
{
возврат нового HttpStatusCodeResult(HttpStatusCode. BadRequest);
}
Сотрудник = дБ.Сотрудников.Найти (id);
if (employee = = null)
{
return HttpNotFound();
}
обратный вид(сотрудник);
}

ddgjgj

в классе Employee удалите это
этот.Customers = new HashSet< customer> (); И это
public virtual ICollection< customer & gt; Customers { get; set; } , поскольку они не существуют , я просто добавил Это для теста , но это не так. А также в классе клиентов удалите их :
public int EmployeeID { get; set; } и
public virtual Employee Employee { get; set; }, они тоже не существуют в базе данных.

ddgjgj

все в порядке:

Сотрудник = дБ.Сотрудников.Include (player = & gt; player.Приказы).Где (i => i. EmployeeID = = id).Метода singleordefault();

0 Ответов