Не удается получить ожидаемый результат во многих отношениях, используя LINQ в Asp.net C #, MVC, приложении Codefirst - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь разработать приложение с использованием Asp.net C #, MVC, Codefirst.

У меня есть два класса актеров и фильмов, которые имеют много-много отношений. (У актера может быть много фильмов, у фильма может быть много актеров)

Теперь я столкнулся с проблемой, я могу получить данные из обеих таблиц, но не так, как ожидалось, я думаю, что где-то что-то не так с логикой моего кода.

Например, я могу получить список фильмов из базы данных, и когда я нажимаю на каждый фильм, он перенаправляет меня на страницу, которая принадлежит этому конкретному фильму, что имеет смысл до этого момента, но теперь я хочу получить список актеров, которые сыграли роль в этом конкретном фильме, и здесь я провалюсь. (Я могу получить весь список актеров, которые существуют в базе данных, но не конкретные актеры, которые сыграли роль в определенном фильме).

Это мои модели:

Это актерский класс:

public class Actors
{
    public int Id { get; set; }
    public string actor_name { get; set; }
    public string country_of_birth { get; set; }    
}

А это класс фильмов:

public class Movies
{
   public int Id { get; set; }
   public string movie_title { get; set; }
   public string genre { get; set; }
}

Это контроллер:

 public ActionResult Index()
 {
     var mv = _context.mvz;
     if (mv==null)
     {
         return Content("Nothing found in database");
     }
        return View(mv);
 }

 public ActionResult Details(int? Id)
 {
     var dtl = _context.mvz.SingleOrDefault(a=> a.Id == Id);
     var vm = new MoviesViewModel()
     {
         mvz = dtl,
     };
     if (vm==null)
     {
         return Content("Nothing Found!");
     }
        return View(vm);
  }

Это индексный вид, который показывает список фильмов и содержит ссылку на детали каждого фильма в отдельности:

@model IEnumerable<ManyToMany_FinalProject.Models.Movies>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h5>List of Movies</h5>

<table class="table table-bordered table-hover table-responsive">
<thead>
    <tr>
        <th>Id</th>
        <th>Title</th>
    </tr>
</thead>
@foreach (var movie in Model)
{
    <tbody>
        <tr>
            <td>@movie.Id</td>
            <td>@Html.ActionLink(movie.movie_title,"Details","Movies",new { Id = @movie.Id},null)</td>      
        </tr>
    </tbody>
}

Это подробное представление, которое должно отображать подробную информацию о каждом фильме, в частности, оно должно отображать список актеров, сыгравших роль в этом конкретном фильме.

@model ManyToMany_FinalProject.ViewModel.MoviesViewModel
@{
ViewBag.Title = "Details";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h5>Details of @Model.mvz.movie_title</h5>

<table class="table table-bordered table-hover table-responsive">
<thead>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Genre</th>
    </tr>
</thead>

<tbody>
    <tr>
        <td>@Model.mvz.Id</td>
        <td>@Model.mvz.movie_title</td>
        <td>@Model.mvz.genre</td>
    </tr>
</tbody>

<h5>Star cast of @Model.mvz.movie_title</h5>

<table class="table table-bordered table-hover table-responsive">
<thead>
    <tr>
        <th>Id</th>
        <th>Name</th>
        <th>Country</th>
    </tr>
    </thead>
   @foreach (var actor in Model.act)
  {
    <tbody>
        <tr>
            <td>@actor.Id</td>
            <td>@actor.actor_name</td>
            <td>@actor.country_of_birth</td>
        </tr>
    </tbody>
  }
</table>

И, наконец, это модель представления:

 public class MoviesViewModel
{
    public Movies mvz { get; set; }
    public List<Actors> act { get; set; }
    public MoviesViewModel()
    {
        mvz = new Movies();
        act = new List<Actors>();
    }
}

Я знаю, что что-то не так с логикой LINQ, которую я пишу, чтобы получить список актеров в классе контроллера.

Если кто-то, имеющий опыт в этом отношении, читает этот пост, пожалуйста, наведите мне правильную логику, которую я должен использовать для LINQ, или любой другой подход, который поможет мне получить результат.

1 Ответ

0 голосов
/ 01 сентября 2018

1) Вы должны настроить отношения «многие на май» между обеими вашими моделями Actors и Movies

Вы будете следовать шагам к Configure Many-To-Many Relationship in Code First.

После настройки отношений ваши модели выглядят так.

public class Actors
{
    public Actors()
    {
        this.Movies = new HashSet<Movies>();
    }

    public int Id { get; set; }
    public string actor_name { get; set; }
    public string country_of_birth { get; set; }
    public virtual ICollection<Movies> Movies { get; set; }
}

public class Movies
{
    public Movies()
    {
        this.Actors = new HashSet<Actors>();
    }

    public int Id { get; set; }
    public string movie_title { get; set; }
    public string genre { get; set; }
    public virtual ICollection<Actors> Actors { get; set; }
}

И ваш класс контекста будет выглядеть как

public class YourDBContext : DBContext
{
    public YourDBContext() : base("YourDbConnectionString")
    {
    }

    public DbSet<Movies> Movies { get; set; }
    public DbSet<Actors> Actors { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //If you face any problem that contains cascade delete then add below line.
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        base.OnModelCreating(modelBuilder);
    }
}

2) Измените MoviesViewModel в соответствии с нижеприведенным описанием.

public class MoviesViewModel
{
    public Movies mvz { get; set; }
    public List<Actors> actrs { get; set; }
}

3) И тогда вы получите свой фильм и его актеров по методу ниже действия.

public ActionResult Details(int? Id)
{
    //This will return single movie with your parameter id
    var mvz = _context.mvz.SingleOrDefault(a => a.Id == Id);

    //This will gives you actors of above movie. 
    var actrs = mvz.Actors.ToList();

    var vm = new MoviesViewModel()
    {
        mvz = mvz,
        actrs = actrs
    };

    if (vm == null)
    {
        return Content("Nothing Found!");
    }

    //This view model return your both of movie and its actors.
    //Capture both in your model and render in your view.
    return View(vm);
}

Попробуйте один раз, может ли это вам помочь:)

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