LINQ结果的属性为NULL但关系正常

时间:2013-01-03 17:24:18

标签: 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; }
    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属性。

2 个答案:

答案 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}         
}