实体框架模型和angularjs

时间:2016-02-21 07:59:38

标签: angularjs entity-framework asp.net-core-mvc

我正在尝试在Visual Studio中创建一个带有部分angularjs v1.4.6前端的MVC 6项目。我在混合中使用WebAPI来获取并放入Entity Framework代码优先数据库。 该网站旨在允许用户记录电影所在的电影集,它所处的媒体类型以及通过REST $ http调用查找imdb来检索的详细信息。 主模型看起来像这样。

namespace OurMovies.Models
{
    public class Movie
    {
        public int ID { get; set; }
        public int MovieCollectionID { get; set; }
        public int LocationID { get; set; }
        public int MediaTypeID { get; set; }
        public string Title { get; set; }

        public int MovieDetailID { get; set; }

        public virtual MediaType MediaType { get; set; }
        public virtual MovieCollection MovieCollection { get; set; }
        public virtual Location Location { get; set; }
        public virtual MovieDetail MovieDetail { get; set; }
    }
}

-

// GET: api/Movies
        [HttpGet]
        public IEnumerable<Movie> GetMovies(int? collectionID)
        {
            return _repo.GetMovies(collectionID);
        }

// POST: api/Movies
        [HttpPost]
        public async Task<IActionResult> PostMovie([FromBody] Movie movie)
        {
            if (!ModelState.IsValid)
            {
                return HttpBadRequest(ModelState);
            }

            _context.Movie.Add(movie);
            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (MovieExists(movie.ID))
                {
                    return new HttpStatusCodeResult(StatusCodes.Status409Conflict);
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("GetMovie", new { id = movie.ID }, movie);
        }

我的问题是,电影的GET调用并没有完全扩展虚拟成员,例如

MediaType  {"ID":1 , "name": "DVD"}
Location   {"ID":1,"name":"Shelf 1"}

我最终得到了这个:

获取http://localhost:43408/api/Movies

[
  {
    "ID": 2,
    "LocationID": 2,
    "MediaTypeID": 2,
    "MovieCollectionID": 1,
    "MovieDetailID": 1,
    "Title": "Sherlock Holmes",
    "MediaType": **null**,
    "MovieCollection": **null**,
    "Location": **null**,
    "MovieDetail": **null**
  },
  {
    "ID": 3,
    "LocationID": 1,
    "MediaTypeID": 1,
    "MovieCollectionID": 1,
    "MovieDetailID": 2,
    "Title": "Jurassic Park",
    "MediaType": null,
    "MovieCollection": null,
    "Location": null,
    "MovieDetail": null
  }

这是一个新手问题,但我想知道如何扩展外键,以便我可以在angularjs页面中看到类似MediaType.name的数据。我的主电影页面如下所示:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<!--moviesView.html-->
<div class="row">
    <wait-cursor display-when="vm.isBusy"></wait-cursor>
    <h2>Movie Index</h2>
    <div>
        <p>Movie Title: <input type="text" class="fa-search" ng-model="searchString"></p>
        <p>
            <a ng-href="#/create">Add Movie to Collection - {{movies[0].collection.name}}</a>
        </p>
        <table class="table table-responsive table-striped">
            <tr><th>Movie Title</th><th>Movie Location</th><th>Media Type</th><th></th></tr>

            <tr ng-repeat="movie in movies | filter: searchString">
                <td ng-bind="movie.ID" hidden>
                     {{movie.ID}}
                </td>
                <td>
                    <a ng-href="#/show/{{movie.ID}}">{{movie.Title}}</a>
                </td>
                <td ng-bind="movie.movieLocation.name">                   
                </td>
                <td ng-bind="movie.mediaType.name">                   
                <td>
                    <a ng-href="#/edit/{{movie.ID}}">Edit</a> |
                    <a ng-href="#/show/{{movie.ID}}">Details</a> |
                    <a ng-href="#/delete/{{movie.ID}}">Delete</a>
                </td>
            </tr>

        </table>
    </div>
</div>

1 个答案:

答案 0 :(得分:0)

如何加载相关值有很多可能性。最简单的方法是使用linq语句中的.Include()更新存储库中的Get方法以加载相关实体。

var movies = context.Movies 
                   .Include(m => m.MediaType) 
                   .Include(m => m.Location)
                   .FirstOrDefault(m => m.ID == movieId); 

另一种方法(但不推荐)是在DBcontext创建中禁用延迟加载。

还有更多选项,您可以在此链接中找到它们:

https://msdn.microsoft.com/en-us/data/jj574232.aspx