Я использую EFCodefirst. Большинство из вас знают, но следующий код является частью MVC3 T4 CodeTemplates в Edit.tt, а также в Create.tt из AddView:
<div class="editor-field">
<#
if (property.IsForeignKey) {
#>
@Html.DropDownList("<#= property.Name #>", String.Empty)
<#
} else {
#>
@Html.EditorFor(model => model.<#= property.Name #>)
<#
}
#>
@Html.ValidationMessageFor(model => model.<#= property.Name #>)
</div>
Как вы видите, если CodeTemplates находят свойство как FK, генерирует DropDownList автоматически, но вопрос в том, как определить реквизит как FK? это мои модели:
public class Artist {
public long Id { get; set; }
public string Name { get; set; }
public Genre Genre { get; set; }
}
public class Genre {
public long Id { get; set; }
public string Title { get; set; }
public ICollection<Artist> Artists { get; set; }
}
public class MusicGalleryDB : DbContext {
public DbSet<Artist> Artists { get; set; }
public DbSet<Genre> Genres { get; set; }
}
Я ожидал, что жанр в классе Artist - это FK, и при создании представления Artist я могу выбрать жанр в раскрывающемся списке, но mvc фактически не генерирует выпадающий список в представлениях, поскольку представление mvc не имеет никакого отношения между жанром и Исполнитель. Когда я смотрю на таблицы базы данных, я вижу следующее:
Artist(Id, Name,Genre_Id)
Genre(Id, Title)
как вы видите, в таблице Artist есть имя столбца Genre_Id, которое представляет собой таблицу FK-Id таблицы жанра. Эта таблица генерируется автоматически с помощью EFCodefirst, но MVC CodeTemplate не может распознавать FK.
Как я могу это сделать?
Я знаю, что могу написать свои собственные представления, но мне интересно, чтобы mvc автоматически генерировал представления. Кто-нибудь знает об этом?
Редактировать
Это мой контроллер (генерируется автоматически mvc):
public class ArtistController : Controller
{
private MusicGalleryDB db = new MusicGalleryDB();
//
// GET: /Artist/
public ViewResult Index()
{
var artists = db.Artists.Include(a => a.Genre);
return View(artists.ToList());
}
//
// GET: /Artist/Details/5
public ViewResult Details(int id)
{
Artist artist = db.Artists.Find(id);
return View(artist);
}
//
// GET: /Artist/Create
public ActionResult Create()
{
ViewBag.GenreID = new SelectList(db.Genres, "Id", "Title");
return View();
}
//
// POST: /Artist/Create
[HttpPost]
public ActionResult Create(Artist artist)
{
if (ModelState.IsValid)
{
db.Artists.Add(artist);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GenreID = new SelectList(db.Genres, "Id", "Title", artist.GenreID);
return View(artist);
}
//
// GET: /Artist/Edit/5
public ActionResult Edit(int id)
{
Artist artist = db.Artists.Find(id);
ViewBag.GenreID = new SelectList(db.Genres, "Id", "Title", artist.GenreID);
return View(artist);
}
//
// POST: /Artist/Edit/5
[HttpPost]
public ActionResult Edit(Artist artist)
{
if (ModelState.IsValid)
{
db.Entry(artist).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GenreID = new SelectList(db.Genres, "Id", "Title", artist.GenreID);
return View(artist);
}
//
// GET: /Artist/Delete/5
public ActionResult Delete(int id)
{
Artist artist = db.Artists.Find(id);
return View(artist);
}
//
// POST: /Artist/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
Artist artist = db.Artists.Find(id);
db.Artists.Remove(artist);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}