0

EntityFramework4.4を既存の.NET4.0アプリケーションに組み込んでいます。DbContextそれにはある程度のモジュール性があり、スキーマごとに1つ必要です。例えば

public class AnimalContext : DbContext // animal schema
{
    public IDbSet<Dog> Dogs { get; set; }

    public IDbSet<Cat> Cats { get; set; }
}

public class FruitContext : DbContext // fruit schema
{
    public IDbSet<Apple> Apples { get; set; }

    public IDbSet<Pear> Pears { get; set; }
}

一部のエンティティは、たとえば、異なるスキーマのエンティティを参照します

public class Dog
{
    public Apple Apple { get; set; }
}

異なるコンテキストによって作成されたエンティティが同じであることを確認する方法はありますか?IE

var animals = new AnimalContext()
var fruits = new FruitContext()

var dog = animals.Dogs.First();
var apple = fruits.Apples.First(x => x == apple)

// and object.ReferenceEquals(apple, dog.Apple)
4

2 に答える 2

0

異なるコンテキスト(同じコンテキストタイプの異なるインスタンスでさえ)によって作成されたエンティティは同じではありません。

私見ではAnimalContext、で定義されたオブジェクトのインスタンスを作成できないようにすることで自分で処理する必要がありFruitContextます-あなたの場合はAppleエンティティであり、によってロードされた後にApple割り当てる-でプロパティを公開する必要があります。これは、イベントハンドラーで相互接続を処理することでおそらく自動化できますが、オブジェクトの読み込みが遅くなり、コンテキストが緊密に結合される可能性があります。DogFruitContextAppleIdDogObjectContext.ObjectMaterialized

プロパティまたはdogのNotMapped属性を使用するか、のマッピング定義のクラスまたはプロパティの流暢なマッピングで使用できます。に逆ナビゲーションプロパティがある場合は、を無視する必要があります。AppleIgnoreAppleAppleAnimalContextAppleDogDogFruitContext

于 2013-01-04T09:34:55.970 に答える
0

異なるによって作成されたエンティティが同じであることを保証するには、コンストラクタを介して渡すことができるDbContext共通を共有する必要があります。ObjectContextDbContext

ObjectContextコードファーストアプローチを使用してコモンを作成する方法は、 DbModelBuilder-を使用することです。これらのいずれかにアクセスするための推奨されるOnModelCreating(DbModelBuilder)方法は、から継承するクラスのメソッドをオーバーライドすることDbContextです。

例えば:

public class MasterContext : DbContext
{
    public MasterContext(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }

    public static implicit operator ObjectContext(MasterContext obj)
    {
        if (obj == null)
        {
            throw new ArgumentNullException("obj");
        }

        var adapter = (IObjectContextAdapter)obj;

        return adapter.ObjectContext;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Dog>();
        modelBuilder.Entity<Cat>();
        modelBuilder.Entity<Apple>();
        modelBuilder.Entity<Pear>();
    }
}

public class AnimalContext : DbContext
{
    public AnimalContext(ObjectContext context)
        : base(context, false)
    {
    }

    public IDbSet<Dog> Dogs { get; set; }

    public IDbSet<Cat> Cats { get; set; }
}

public class FruitContext : DbContext
{
    public FruitContext(ObjectContext context)
        : base(context, false)
    {
    }

    public IDbSet<Apple> Apples { get; set; }

    public IDbSet<Pear> Pears { get; set; }
}

//...
var master = new MasterContext("my connection")
var animals = new AnimalContext(master)
var fruits = new FruitContext(master)

var dog = animals.Dogs.First();
var apple = fruits.Apples.First(x => x == apple)

// Passes
Debug.Assert(object.ReferenceEquals(apple, dog.Apple))

ここで注意すべき重要なことは、すべてのスレーブで使用されるすべてのタイプを登録OnModelCreatingする必要があるということです(これをスリックして、必要なものすべてを自動的に登録することができます)。MasterContextDbContexts

于 2013-01-04T10:23:04.967 に答える