0

Entity Framework の Database First アプローチを使用しています。1 つのデータベースに複数の会社を持ちたいので、DBContext を作成するときにテーブル名の前にプレフィックス (つまり、Company1$Users、Company2$Users) を追加して、テーブル名を上書きできるようにしたいと考えています。会社を変えるまでは、最初はすべてうまくいきます。DBContext はエンティティをキャッシュしているようで、次回コンテキストを作成するときに OnModelCreating を起動しません。私はほとんどどこでも解決策を探してきましたが、何も見つからないようです。この問題を抱えているのは私だけですか? それは実際に可能ですか?誰かがこれで私を助けてくれますか?

問題を再現するコードは次のとおりです。

public class User 
{ 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Username { get; set; } 
}

public class EntityMappingContext : DbContext
{
    public String CompanyId { get; set; }
    public DbSet<User> Users { get; set; }

    public EntityMappingContext(string companyId = null) : base("DB")
    {
        CompanyId = companyId;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().ToTable(CompanyId + "$Users");
        base.OnModelCreating(modelBuilder);
    }

}

問題を再現するには、次を実行できます。

using (var context = new EntityMappingContext("Company1"))
{
    foreach (var user in context.Users)
    {
        Console.WriteLine(user.FirstName + " " + user.LastName);
    }
}
using (var context = new EntityMappingContext("Company2"))
{
    foreach (var user in context.Users)
    {
        Console.WriteLine(user.FirstName + " " + user.LastName);
    }
}

最初と 2 番目のコンテキストは Company1$Users をクエリしますが、2 番目のコンテキストは "Company2" で呼び出します。

4

1 に答える 1

0

ここのドキュメントを読むと、OnModelCreatingメソッドについて次のように書かれています。

通常、このメソッドは、派生コンテキストの最初のインスタンスが作成されたときに1回だけ呼び出されます。次に、そのコンテキストのモデルがキャッシュされ、アプリドメイン内のコンテキストの以降のすべてのインスタンス用になります。このキャッシュは、特定のModelBuidlerでModelCachingプロパティを設定することで無効にできますが、パフォーマンスが大幅に低下する可能性があります。DbModelBuilderクラスとDbContextクラスを直接使用することで、キャッシュをより細かく制御できます。

それが役に立てば幸い

于 2012-12-03T11:58:38.433 に答える