1

プロジェクトをEntityObjectジェネレーターからDbContextに切り替えた後、新しいオブジェクトのいくつかのナビゲーションプロパティを使用して問題が発生しました。私は問題の調査にかなりの時間を費やしてきましたが、望ましい解決策に近づくことはできません。

まず、生成されたクラス定義:

public partial class Category
{
    public Category()
    {
        this.Limits = new HashSet<Limit>();
    }

    public int CategoryId {get; set;}
    public string Name {get; set;}
    public virtual ICollection<Limit> Limits { internal get; set; }
}

public partial class Limit
{
    public int CategoryId {get; set;}
    public string Description {get; set;}
    internal virtual Category Category { get; set; }
}

次のコードを使用して、統合テスト中にテストデータを作成しています。

using (GFCAMDataContext db = new GFCAMDataContext())
{
    limit = new Limit()
    {
        CategoryId = testData.CategoryId,
        Description = "SignerController.Update"
    };

    db.Limits.Add(limit);
    db.SaveChanges();
}

他に変更を加えないと、新しく作成したLimitオブジェクトのLimit.Categoryプロパティは何も返しません。ただし、SaveChangesが呼び出される前にDbContextから目的のカテゴリをクエリすると、新しいLimitのナビゲーションプロパティが関連付けられたカテゴリを返し始めます。ObjectContextを使用すると、Categoryプロパティが私からの介入なしに更新されます。

ObjectContextと同じ動作をしたいのですが、この目標を達成する方法が見つからないようです。私はいくつかの提案された解決策を見てきました:

  • ナビゲーションプロパティを公開します。これは同じ動作であり、パブリックナビゲーションプロパティはシリアル化中に問題を引き起こす可能性があり、ビジネスレイヤーの外部では必要ないため、望ましくありません。

  • すべてのプロパティをパブリック仮想にし、DbSet.Createを使用してプロキシを確実に作成します。これにより同じ動作が発生し、インスタンスを動的に作成するコードがあるため、必ずしも望ましいとは限りません(つまり、エンティティインスタンスを作成するときにDbSetにアクセスできません)。

誰かがこの問題の解決策について何か提案がありますか?

4

1 に答える 1

0

1つの解決策は、ネストされたエンティティを明示的にロードすることです。

db.SaveChanges();
db.Entry(person).Reference(z => z.Category).Load();

プロキシが有効になっている場合のもう1つのオプションは、実際にを呼び出すことDbSet.Create<T>()です。DbSetエンティティの作成時にインスタンスにアクセスできない場合は、それを可能にするリポジトリインターフェイスでパブリックメソッドを公開することをお勧めします。例えば:

public interface IRepository<T>
{
    T Add(T entity);

    T GetById(...);

    void SaveChanges();

    ...

    T CreateInstance(); // Concrete implementation have access to DbSet and uses DbSet.Create<T>()
}
于 2013-02-06T13:22:58.733 に答える