Как определить свойства как внешние ключи в моделях для MVC Codetemplates генерировать его как FK - PullRequest
0 голосов
/ 23 ноября 2011

Я использую 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);
    }
}

1 Ответ

4 голосов
/ 23 ноября 2011

Вы забыли включить свойство GenreID в таблицу Artist. Обновите его до следующего.

public class Artist 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int GenreId { get; set; } // You forgot this
    public Genre Genre { get; set; }
}

Кстати, вам не нужно использовать long, int достаточно для Id.

...