c# – MVC MusicStore Artist.Name对象引用未设置为对象的实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – MVC MusicStore Artist.Name对象引用未设置为对象的实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3151字,纯文字阅读大概需要5分钟。
内容图文
![c# – MVC MusicStore Artist.Name对象引用未设置为对象的实例](/upload/InfoBanner/zyjiaocheng/801/62b03d8e8d7445c08c3887b9f52d38a9.jpg)
通过MVC MusicStore学习MVC时,我的头脑开裂.详细信息视图页面的Model.Artist.Name出现此错误.
我的Storecontroller Details方法应该没问题.
public ActionResult Details(int id)
{
//returns and albums searched from the id
var albums = storeDB.Albums.Find(id);
return View(albums);
}
这就是我输出视图的方式
<li>Price : <%=Model.Price %></li>
<li>Artist : <%=Model.Artist.Name%></li>
价格合理,只显示Model.Genre.Name和Artist.Name的错误.我怀疑samplesata.cs中这些属性的声明导致了这个问题
Artist = artists.Single(a => a.Name == "Aaron Copland & London Symphony Orchestra")
但我对此的了解太弱,无法弥补任何事情.请帮忙 .
好吧,该值是从类似这样的类文件中获取的
protected override void Seed(MusicStoreEntities context)
{
var artists = new List<Artist>
{
new Artist { Name = "Aaron Copland & London Symphony Orchestra" },
etcetc
}
new List<Album>
{
new Album { Title = "ABC", Artist= artists.Single(g => g.Name == "Test")}
}
}
请注意如何分配值,我可以访问Model.Title(模型作为简写),但是Model.Artist.Name导致了我的错误.
解决了
好吧,通过在Album类中为Artist和Genre声明添加virtual关键字来实现它.但我仍然不确定会发生什么事情,并希望有人照顾.
在我的Album类中,在它被解决之前它看起来像这样
public class Album
{
public int AlbumId { get; set; }
public int GenreId { get; set; }
public int ArtistId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public string AlbumArtUrl { get; set; }
public Genre Genre { get; set; }
public Artist Artist { get; set; }
}
通过添加Virtual关键字来解决由Genre和Artist引起的错误
public virtual Artist Artist { get; set; }
不知何故,我仍然无法证明发生了什么,并希望了解更多.有人在乎解释吗?
就像这样,Album.cs
namespace MvcMusicStore.Models
{
public class Album
{
public int AlbumId { get; set; }
public int GenreId { get; set; }
public int ArtistId { get; set; }
public string Title { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
}
使用EF MusicStore.cs
namespace MvcMusicStore.Models
{
//represent entity framework , handle create ,read , update and del ops
public class MusicStoreEntities : DbContext
{
public DbSet<Album> Albums { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<Artist> Artists { get; set; }
}
}
并在StoreController.cs中实现
MusicStoreEntities storeDB = new MusicStoreEntities();
public ActionResult Details(int id)
{
//returns and albums searched from the id
var albums = storeDB.Albums.Find(id);
return View(albums);
}
最后是样本数据
protected override void Seed(MusicStoreEntities context)
{
var artists = new List<Artist>
{
new Artist { Name = "Aaron Copland & London Symphony Orchestra" },
etcetc
}
new List<Album>
{
new Album { Title = "ABC", Artist= artists.Single(g => g.Name == "Test")}
}
}
解决方法:
你是对的.该错误指的是Genre对象和Artist对象尚未实例化的事实,因此尝试访问其中任何一个的Name属性都会引发错误.
问题发生在Find()方法中.如果您使用的是LinqToSql,EF,NHibernate或simliar,请检查您的映射是否正确.
更新:
根据修改后的代码,如果您正在做艺术家.单(g => g.Name ==“Test”)那么如果没有名称为“Test”的艺术家或其他什么,这将抛出NullReferenceException.
我会建议在除了字符串之外的其他内容上进行匹配.如果可能,使用Id执行匹配.这将提供更可靠的匹配条件.
理想情况下,您应该使用SingleOrDefault()并检查是否返回null.
内容总结
以上是互联网集市为您收集整理的c# – MVC MusicStore Artist.Name对象引用未设置为对象的实例全部内容,希望文章能够帮你解决c# – MVC MusicStore Artist.Name对象引用未设置为对象的实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。