Правильный способ объединения таблиц (моделей) для MVC просмотра с использованием EF, необходимо использовать в списке данных и операциях CRUD - PullRequest
0 голосов
/ 12 марта 2020

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

У меня есть класс для команд и один для местоположений, оба из которых совместно используют LocationId в качестве FK. Мне нужно отобразить информацию о команде и ИМЯ местоположения в зависимости от значения LocationId в таблице команд. Это должно быть легко, но я новичок в EF и не могу заставить его работать.

Я создал ViewModel для класса Teams и добавил список «Location», как вы увидите в коде ниже .

У меня есть две проблемы: нет результатов для Location в представлении (я все равно не знаю, как присоединить это к LocationId), поэтому, если он отображает что-то, это будет неправильно. Вторая проблема заключается в том, что, несмотря на то, что у меня есть Местоположение, доступное в Представлении, у меня нет возможности перейти к Имени.

Мой класс местоположений

public class Locations
{
    [Key]
    public int LocationId { get; set; }
    [Required(ErrorMessage = "Please enter a Location Name")]
    [MaxLength(50, ErrorMessage = "Name cannot exceed 50 characters")]
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    [Required]
    [Range(0, 99999, ErrorMessage = "Please enter a valid Zip Code")]
    public int ZipCode { get; set; }
    [Required(ErrorMessage = "Please enter a Phone Number")]
    [DataType(DataType.PhoneNumber)]
    [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$", ErrorMessage = "Please enter a valid Phone Number")]
    public string Telephone { get; set; }
    [Required(ErrorMessage = "Please enter an Email Address")]
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$",
        ErrorMessage = "The Email Address you have Entered is Invalid")]
    public string Email { get; set; }        
    public string Website { get; set; }
    [Required]
    [Display(Name = "Is Active?")]
    public bool IsActive { get; set; }
}

Класс моих команд

public class TeamsViewModel
{
    [Key]
    public int TeamId { get; set; }
    [Required(ErrorMessage = "Please enter a Team Name")]
    [MaxLength(50, ErrorMessage = "The Team Name cannot exceed 50 characters")]
    public string Name { get; set; }
    [Required]
    [Range(1, 99999, ErrorMessage = "Please Select a Home Location")]
    [Display(Name = "Home Location")]
    public int LocationId { get; set; }
    [Required]
    [Display(Name = "Is Active?")]
    public bool IsActive { get; set; }        
    public List<Locations> Location { get; set; }
}

Действие моего контроллера для этой страницы

public IActionResult Teams()
{
    var model = _teamRepository.GetAllTeams();
    return View("Teams", model);
}

И часть моего взгляда

@foreach (var team in Model)
{
    <tr class="tblRow">
        <td>@team.Name</td>
        **<td>@team.Location</td>**
        <td>
            <a class="btn btn-outline-info m-1"
               asp-controller="admin" asp-action="editTeam" asp-route-id="@team.Location">
                Edit
            </a>
        </td>
        <td>
            @using (Html.BeginForm("DeleteTeam", "Admin", team))
            {
                <input type="submit" value="Delete"
                       class="btn btn-outline-danger m-1"
                       onclick="return confirm('Are you sure you wish to delete this Team?');" />
            }
        </td>
        <td class="activeStatus" style="display:none;">
            @team.IsActive
        </td>
    </tr>
}

Ответы [ 2 ]

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

Вы можете использовать функцию Include в linq для получения списка местоположений, связанных с TeamsViewModel.

 public IActionResult Teams()
        {
            var model = _context.TeamsViewModel.Include(x => x.Location).ToList();
             return View("Teams", model);
        }

В связи с этим вам необходимо добавить foreach к спискам местоположений l oop (команда), чтобы показать название места.

  @foreach (var team in Model)
    {
        @foreach (var location in team.Location)
        {
            <tr class="tblRow">
                <td>@team.Name</td>
                <td>@location.Name</td>
                <td>
                    <a class="btn btn-outline-info m-1"
                       asp-controller="Team" asp-action="editTeam" asp-route-id="@location.LocationId">
                        Edit
                    </a>
                </td>
                <td>
                    @using (Html.BeginForm("DeleteTeam", "Team", team))
                    {
                        <input type="submit" value="Delete"
                               class="btn btn-outline-danger m-1"
                               onclick="return confirm('Are you sure you wish to delete this Team?');" />
                    }
                </td>

                <td class="activeStatus" style="display:none;">
                    @team.IsActive
                </td>
            </tr>
        }

    }
0 голосов
/ 12 марта 2020

Должно быть так же просто, как

var q = from t in db.Teams
        select new TeamsViewModel()
        {
          TeamId = t.TeamId,
          Name = t.Name,
          . . .
          Locations = t.Locations.ToList()
        };

var results = q.ToList();
...