我已经设置了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中,我可以创建对象并填充它们。数据库被创建,并且Language和Article的外键都出现在Edition表中并正确输入。
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();
我现在可以查询Editions并返回它们的列表,但是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和实体框架,不能弄清楚为什么我总是得到这个错误。我甚至可以通过r => r. language . id == 1进行查询,并且仍然可以在Edition对象上获得NULL属性。
确保您以正确的方式首先使用EF代码。这里有一些模棱两可的地方。您必须确定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
,我只是添加了一个Include语句到我的linq
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}
}