Asp.net mvc LINQ结果的属性为NULL,但关系正在工作

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

我已经建立了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; }
    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中是推荐的。