2016-06-23 6 views
1

私たちのプロジェクトは、1つの大きなMSSQLデータベースに依存しています。そのデータベースは他の多くのアプリに公開されています。それらのうちのいくつかは、EFデータベースの第1モデルを使用しています。そのデータベースには300を超えるテーブルがあります。それらのうちのいくつかは、アプリケーションの他の部分に使用する必要があります。データベースをリバースエンジニアリングすると、EFはすべてのテーブルを持つモデルを問題なく作成します。時には私たちのコードではテーブルを1つだけ使用していますが、まだ大きなモデルを宣言する必要があります。大きなEFデータベースモデルは、アプリのパフォーマンスを大幅に費やしますか

私はいつも大量のテーブルを持つモデルを初期化すると、パフォーマンスがアプリに損なわれることになります。私たちのアプリは、ほとんどのWeb-APIコントローラの数を含むMVCアプリケーションです私たちは、この

public string peaceOfData(int id) 
{ 
    using (modelWhit500tables largeMode = new modelWhit500tables()) 
    { 
     return largeMode.onlyOneTable.Find(id).data; 
    } 
} 

のようなコードを持っているときのシーンの後ろに起こっ

データベース層の簡素化とデータベース設計の変更の容易なメンテナンスのために、大きなモデルが1つあります。

+1

ちょうどメモとして、このような観点についてEFの洞察について話すが、NHibernateは持っ_lot_とすることはできませんSessionFactoryを構築するときにモデル/マップのパフォーマンスを "傷つける"ことができますが、XMLマッピングをキャッシュし、変更されていなければディスクからリロードするための回避策があります。ただし、セッションファクトリの構築は、通常、アプリケーションプールの起動ごとに1回発生します。 – kayess

答えて

1

this postは、少なくとも部分的には、あなたの質問に答えるのに、私は、EFの内部にコメントすることができません:あなたは、Entity Frameworkのまだ見解をプリコンパイルする場合であっても

巨人が

コンテキストコンテキストが最初に初期化されたときに仕事をしなければならず、仕事はモデルのエンティティの数に比例して です。一握りのテーブルが の場合、それほど心配する必要はありません。

ただし、EFを使用する一般的な方法は、既存のデータベースからコンテキストを自動的に生成し、すべてのオブジェクトを にインポートすることです。当時、これはあなたの データベースでの作業能力を最大化するので、慎重に感じました。非常に控えめなデータベースでさえ、 には何百ものオブジェクトが含まれている可能性があるため、パフォーマンスの影響はすぐに になり、起動時間は分単位で変化します。あなたのコンテキストが実際に を知る必要があるかどうかを検討する価値があると考える価値があります。そうでない場合は、これらのオブジェクトを削除してください。

重要なのは、アプリケーションのインスタンスがDBコンテキストに初めてアクセスするときに、コンテキストが初期化プロセスを実行することです。これは上の引用符で言及されているものです。これは、コンテキストによってコードが処理されたとしても、アプリケーションまたはWebサービスに対して1回だけ発生します。これは、アプリケーションにとって一回のパフォーマンスヒットです。このためにアプリケーションにアクセスする最初のユーザーを処罰するのではなく、アプリケーションの起動時にこれを明示的に起動することができます。

EFのパフォーマンスに関する考慮事項は、this MSDN articleに記載されています。モデルの読み込みとメタデータのマッピングで最も大きなヒットを得ます。あなたのケースでは、MVCとWeb APIアプリケーションのために、それはあなたがあなたのアプリケーションドメインが定義されているかによって異なります。

enter image description here

+0

"あなたのコードによってコンテキストが処分されたとしても、"スパイミングのためにsory "と表示されます。これはまた、MVCのconntolesと.NET Web APIのcontentsの場合です。私はあなたの答えをundestand正しい場合。私がモデルを使用するときには、初歩は初めてのサーファーです。たびにそれについて嘆くことはあまりありません。モデルが他のクラスで使用されても – adopilot

0

300個のテーブルすべてで生成されたモデルを使用する代わりに、コードファーストアプローチを使用して独自のdbContextを作成できます。その後、データベースの表面を縮小して作業することができます。より良いパフォーマンスを得るには、この方法でもアプリケーションごとにテーブルごとに必要のないフィールドを無視することもできます。 300のうち2つのテーブルのみを使用する簡略化された例として、

public class Customer { public int id {get;セット;}あなたが必要なだけのテーブルとフィールドを照会および更新YourAppContextを使用することができます

public string Custno { get; set; } 
    public string Name { get; set; } 
    public decimal Balance { get; set; } 

    // The table other fields are ignored... 

    public List<CustomerAddress> Addresses { get; set; } 


    } 
} 

public class CustomerAddress 
{ 
    public int id { get; set;} 

    public int Customerid { get; set; } 

    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string Cityname { get; set; } 
    public string Statename { get; set; } 
    public string Countryname { get; set; } 
    public string Zipname { get; set; } 

    public Customer Customer { get; set; } 


} 
    public class CustomerMap() 
    { 

     ToTable("Customers"); 

     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     HasKey(k => k.Id); 

     Property(p => p.Custno).HasMaxLength(8).IsRequired(); 
     Property(p => p.Name).HasMaxLength(120).IsRequired(); 
     Property(p => p.Balance).HasPrecision(18, 2); 

     HasMany(a => a.Addresses).WithRequired(x => x.Customer).HasForeignKey(k => k.Customerid); 

    } 

    public class CustomerAddressMap() 
    { 

     ToTable("CustomerAddresses"); 

     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     HasKey(k => k.Id); 


     Property(p => p.Address1).HasMaxLength(120); 
     Property(p => p.Address2).HasMaxLength(120); 
     Property(p => p.Cityname).HasMaxLength(40); 
     Property(p => p.Countryname).HasMaxLength(40); 
     Property(p => p.Statename).HasMaxLength(40); 
     Property(p => p.Zipname).HasMaxLength(6); 


     HasRequired(x => x.Customer).WithMany(a => a.Addresses).HasForeignKey(k => k.Customerid).WillCascadeOnDelete(false); 

    } 

    public class YourAppContext : DbContext 
{ 
    public YourAppContext() 
     : base("YourAppContext") 
    { 
     Database.SetInitializer<YourAppContext>(null);  
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new CustomerMap());    
     modelBuilder.Configurations.Add(new CustomerAddressMap());  

    } 


    public DbSet<Customer> Customer { get; set; } 
    public DbSet<CustomerAddress> CustomerAddresses { get; set; } 


} 

この方法です。

+0

まず最初にDBからコードに切り替えることは、深刻な足場がなくても簡単ではないかもしれません。また、OPの質問に答えるのではなく、代わりにDBをモデル化するための別のアプローチを提案します。 –

関連する問題