Asp.net mvc LINQ结果的属性为NULL,但关系正在工作
我已经建立了3个模型,首先是代码,它们之间的关系似乎很正常,但有一个给我带来了问题 我有文章课、语言课和编辑课Asp.net mvc LINQ结果的属性为NULL,但关系正在工作,asp.net-mvc,linq,entity-framework,Asp.net Mvc,Linq,Entity Framework,我已经建立了3个模型,首先是代码,它们之间的关系似乎很正常,但有一个给我带来了问题 我有文章课、语言课和编辑课 public class Article { public int ID { get; set; } public string Name { get; set; } public string Icon { get; set; } } public class Language { public int ID { get; set; } pu
public class Article
{
public int ID { get; set; }
public string Name { get; set; }
public string Icon { get; set; }
}
public class Language
{
public int ID { get; set; }
public string Name { get; set; }
public string Code { get; set; }
}
public class Edition
{
public int ID { get; set; }
public Article Article { get; set; }
public Language Language { get; set; }
public string Title { get; set; }
public string Details { get; set; }
}
在我的bootstrap/DBinitialiser中,我可以创建对象并很好地填充它们。数据库被创建,语言和文章的外键都出现在编辑表上,并且输入正确
var engLang = new Language() {Code="en", Name="English Language"};
var altLang = new Language() {Code="xx", Name="Alternative Language"};
db.Languages.Add(engLang);
db.Languages.Add(altLang);
db.SaveChanges();
var testArt = new Article() { Name = "test" };
db.Articles.Add(testArt);
db.SaveChanges();
db.Editions.Add(new Edition(){Article = testArt, Language = engLang, Title="English Content"});
db.Editions.Add(new Edition(){Article = testArt, Language = altLang, Title="Alternative Content"});
db.SaveChanges();
我现在可以查询版本并返回它们的列表,但是Language属性始终为NULL。Article属性运行良好
var query = db.Editions.Where(r => r.Article.ID == Article.ID);
foreach (Edition item in query)
{
// item.Language => NULL
// item.Article => {Object Article}
}
我不熟悉.net和Entity Framework,不明白为什么我总是遇到这个错误。
我甚至可以通过r=>r.Language.ID==1进行查询,但仍然可以在Edition对象上获得一个NULL属性。确保以正确的方式使用EF codefirst。这里有一些模棱两可的地方。您必须确定在POCO中实际应该存在哪些关系。更改类,如下面所示:
public class Article
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public string Icon { get; set; }
}
public class Language
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public string Code { get; set; }
}
public class Edition
{
[Key]
public int ID { get; set; }
public virtual Article Article { get; set; }
public virtual Language Language { get; set; }
public string Title { get; set; }
public string Details { get; set; }
}
感谢AmirHossein Mehrvarzi帮助我更清晰地编写模型,我认为这是由于在遍历查询结果时延迟加载实体造成的。参考号: 在没有启用
MultipleActiveResultSets
的情况下,我只是在我的linq中添加了一个Include语句
var query = db.Editions.Where(r => r.Article.ID == Article.ID).Include(r => r.Language);
foreach (Edition item in query)
{
// item.Language => {Object Language}
// item.Article => {Object Article}
}
谢谢你的回复。这有助于我更好地编写模型,结果现在不再为空。但是现在的结果是:
“item.Language”引发了“System.Data.EntityCommandExecutionException”类型的异常,我收到一条消息,已经有一个与此命令相关联的打开的DataReader,必须先关闭。
我认为这是指for循环中的延迟加载?要解决多个DataReader问题,请将其添加到连接字符串中:MultipleActiveResultSets=true;默认情况下,这在EF中是推荐的。