6

私は2つの単純なクラスを持っています:

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、コレクションの設定は常に null になります。

私がそれを作るとき、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);
    }
}
4

1 に答える 1

16

あなたはあなたのを処分しているので、あなたが仮想BackofficeContext化するときに起こっているLazyLoadingを使うことはできません.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);
    }
}
于 2012-11-02T17:47:52.630 に答える