2012-11-02 12 views
6

tôi có 2 lớp đơn giản:Entity bất động sản chuyển hướng khung là 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; } 
} 

Khi tôi lấy một SettingCategory từ cơ sở dữ liệu Cài đặt bộ sưu tập luôn là null.

Khi tôi làm cho nó một virtual sau đó nó sẽ nói: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Làm thế nào tôi có thể truy cập danh sách Settings của tôi?

Cách khác xung quanh công trình, nếu tôi truy xuất số Setting từ cơ sở dữ liệu, thuộc tính SettingCategory sẽ được lấp đầy.

Đây là mã di cư ban đầu của tôi kịch bản:

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); 

Và đây là phần mà được nó ra khỏi cơ sở dữ liệu:

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

trả lời

tôi quên bao gồm trong .SettingCategories, nhưng tôi đã thử nó với một lambda:

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

Điều đó không làm việc, nhưng điều này không:

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

Điều này thật lạ. Bạn có thể cho biết bạn đang truy xuất SettingCategory như thế nào? – Anri

+0

Bạn có chắc là bạn có Cài đặt liên quan trong cơ sở dữ liệu của mình không? – Anri

+0

Tôi đang sử dụng Mã đầu tiên với di chuyển để nó có thể làm mọi thứ đúng không? Tôi đã thêm tập lệnh Ban đầu. – YesMan85

Trả lời

16

Bởi vì bạn đang xử lý của bạn BackofficeContext bạn không thể sử dụng LazyLoading, đó là những gì đang xảy ra khi bạn thực hiện Settings ảo.

Bạn có thể tăng tuổi thọ của BackofficeContext hoặc tải mong muốn Settings. Bạn có thể sử dụng tải mong muốn với Include.

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

Tôi đã thử điều đó, nhưng vấn đề là 's.Settings' không phải là một biểu thức được công nhận! 'Không thể giải quyết biểu tượng 'Cài đặt'' Đó là lý do tại sao tôi gãi đầu. – YesMan85

+0

Tôi đã thử điều này ngay bây giờ: '.Include (" Settings ")' và nó hoạt động, kỳ lạ là lambda không hoạt động. – YesMan85

+11

Bạn đã thêm một tham chiếu (sử dụng) vào System.Data.Entity chưa? Các bao gồm mạnh mẽ là rất khuyến khích khi làm refactoring. – Martin4ndersen