C# 如何在模型中将属性定义为外键,以MVC代码模板将其生成为FK
我先用EFCODE。大多数人都知道,但以下代码是Edit.tt和AddView的Create.tt中MVC3 T4代码模板的一部分:C# 如何在模型中将属性定义为外键,以MVC代码模板将其生成为FK,c#,asp.net,asp.net-mvc,t4,C#,Asp.net,Asp.net Mvc,T4,我先用EFCODE。大多数人都知道,但以下代码是Edit.tt和AddView的Create.tt中MVC3 T4代码模板的一部分: <div class="editor-field"> <# if (property.IsForeignKey) { #> @Html.DropDownList("<#= property.Name #>", String.Empty) <# } else { #&
<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>
如您所见,艺术家表中有一个列名Genre_Id,它是Genre表的FK to Id。该表是使用EFCodefirst自动生成的,但MVC CodeTemplate无法识别FK
我该怎么做
我知道我可以编写自己的视图,但我对mvc以正确的方式自动生成视图很感兴趣。有人知道这件事吗
编辑:
这是我的控制器(由mvc自动生成):
您忘记将
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
来说已经足够好了。您忘记了在Artist
表中包含GenreID
属性。将其更新为以下内容
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
,谢谢你,Pankja,这里还有一个关于n-n关系的类似问题,也许你可以帮我我问一下:我意识到在艺术家的详细视图中,流派字段是空的,你对此有什么建议吗?两个版本的Id类型都改变了吗??尝试更改它们,或者您可以在Artist类中将GenreId设置为long
,而不是int
。基本上,它们应该相互匹配。我将所有ID定义为int,问题不是因为这个。这是不可能的,因为Artist model期望GenreID有一个值,如果没有给出,就会抛出错误。您可以使用EF再次创建数据库。如果你有一个.sdf文件,删除它,EF会再次为你创建一个.sdf文件。谢谢你,这里还有一个关于n-n关系的类似问题,也许你可以帮助我。我在这里问:我意识到在艺术家的详细视图中,流派字段是空的,你对此有什么建议吗?两个版本的Id类型都改变了吗??尝试更改它们,或者您可以在Artist类中将GenreId设置为long
,而不是int
。基本上,它们应该相互匹配。我将所有ID定义为int,问题不是因为这个。这是不可能的,因为Artist model期望GenreID有一个值,如果没有给出,就会抛出错误。您可以使用EF再次创建数据库。如果您有一个.sdf文件,请将其删除,EF将再次为您创建该文件
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);
}
}
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; }
}