2012-11-02 205 views
6

我有2个简单的类:实体框架导航属性为null

public class Setting 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid SettingId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public String Value { get; set; } 

    [Required] 
    public SettingCategory SettingCategory { get; set; } 
} 

public class SettingCategory 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid SettingCategoryId { get; set; } 

    [Required] 
    public String Value { get; set; } 

    public ICollection<Setting> Settings { get; set; } 
} 

当我从数据库中检索集合设置总是空一个SettingCategory

当我让它virtual然后它会说:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

如何访问我的Settings名单?

如果我从数据库中检索Setting,则会填充SettingCategory属性,反之亦然。

这是我最初的代码迁移脚本:

CreateTable(
    "dbo.Settings", 
    c => new 
     { 
      SettingId = c.Guid(nullable: false, identity: true), 
      Name = c.String(nullable: false), 
      Value = c.String(), 
      SettingCategory_SettingCategoryId = c.Guid(nullable: false), 
     }) 
    .PrimaryKey(t => t.SettingId) 
    .ForeignKey("dbo.SettingCategories", t => t.SettingCategory_SettingCategoryId, cascadeDelete: true) 
    .Index(t => t.SettingCategory_SettingCategoryId); 

CreateTable(
    "dbo.SettingCategories", 
    c => new 
     { 
      SettingCategoryId = c.Guid(nullable: false, identity: true), 
      Value = c.String(nullable: false), 
     }) 
    .PrimaryKey(t => t.SettingCategoryId); 

这是得到它从数据库中部分:

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 

回答

我忘了包括在.SettingCategories,但我试着用拉姆达:

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .Include(s => s.Settings) 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 

这并不工作,但这样做:

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .Include("Settings") 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 
+0

这很奇怪。你能展示你如何检索SettingCategory? – Anri

+0

你确定你的数据库中有相关的设置吗? – Anri

+0

我使用代码首先进行迁移,所以它应该使一切正常?我添加了我的初始脚本。 – YesMan85

回答

16

因为你处置您的BackofficeContext不能使用惰性加载,这是当你Settings虚拟发生了什么。

您可以延长BackofficeContext的使用期限或迫切加载Settings。您可以使用Include进行热切加载。

public SettingCategory Get(Guid settingCategoryId) 
{ 
    using (var context = new BackofficeContext()) 
    { 
     return context 
      .SettingCategories 
      .Include(s => s.Settings) 
      .FirstOrDefault(s => s.SettingCategoryId == settingCategoryId); 
    } 
} 
+0

我试过了,但问题是's.Settings'不是一个公认的表达式! '不能解决符号'设置''这就是为什么我抓我的头。 – YesMan85

+0

我现在试过这个:'.Include(“Settings”)',那很有效,奇怪的是lambda没有工作。 – YesMan85

+11

您是否添加了对System.Data.Entity的引用(使用)?进行重构时,强烈建议使用强类型的Include。 – Martin4ndersen