属性LINQ结果是NULL,但关系是工作的



我已经设置了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}         
}

最新更新