我已经设置了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。文章属性工作正常。
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属性。
答案 0 :(得分:1)
确保以正确的方式使用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; }
}
答案 1 :(得分:1)
感谢AmirHossein Mehrvarzi帮助我更清楚地编写模型,我相信这个错误是由于在迭代查询结果时实体的延迟加载造成的。参考:Entity Framework: There is already an open DataReader associated with this Command。
未启用MultipleActiveResultSets
我只是在我的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}
}