C# 如何在模型中将属性定义为外键,以MVC代码模板将其生成为FK

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 { #&

我先用EFCODE。大多数人都知道,但以下代码是Edit.tt和AddView的Create.tt中MVC3 T4代码模板的一部分:

 <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; }
}