我正在尝试在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>
答案 0 :(得分:0)
如何加载相关值有很多可能性。最简单的方法是使用linq语句中的.Include()更新存储库中的Get方法以加载相关实体。
var movies = context.Movies
.Include(m => m.MediaType)
.Include(m => m.Location)
.FirstOrDefault(m => m.ID == movieId);
另一种方法(但不推荐)是在DBcontext创建中禁用延迟加载。
还有更多选项,您可以在此链接中找到它们: