2011-11-15 16 views
4

テーブル名は静的ではなく、コンパイル時にわかっているため、実行時にSQLCeデータベースにテーブルを追加したいとします。 私は次のようにEntity Frameworkの4.1とDbContextでこれをやろう:C#EF 4.1 DbContext内でテーブルを動的に作成する

public class PersonContext : DbContext 
{ 
    public PersonContext() 
     : base("UnicornsCEDatabase") 
    { 
    } 
} 
public class Person 
{ 
    public int NameId { get; set; } 
    public string Name { get; set; } 
} 
public class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var db = new PersonContext()) 
     { 
      db.Database.Delete(); 

      //Try to create table 
      DbSet per = db.Set<Person>(); 
      var per1 = new Person { NameId = 1, Name = "James"}; 
      per.Add(per1); 
      int recordsAffected = db.SaveChanges(); 

      Console.WriteLine(
       "Saved {0} entities to the database, press any key to exit.", 
       recordsAffected); 
      Console.ReadKey(); 
     } 
    } 
} 

それがこのエラーをスローし、これを実行しようとすると: エンティティタイプの人は、現在のコンテキストのためのモデルの一部ではありません。

をDbContext(スキーマ付き)をデータベースに定義することなく、実行時にDbContextをに追加することはできますか?

Personで静的にDbContextを定義する場合、EFはデータベース全体とそのテーブルを作成します。これは素晴らしい方法です。例えば

foreach (var item in collection) 
{ 
    string tableName = "PersonTable_"+item.Name; 
    //Add a table with the name tableName to DbContext 
} 

はEFと、この何とか可能ですか私はいくつかの他の技術を用いてこれらを作成する必要がありますか?モデルは

Database.SetInitializer<DataContext>(
       new DropCreateDatabaseIfModelChanges<DataContext>()); 

かを変更したとき、それはデシベルをドロップするので、あなたが次のように使用することができ

おかげで、ユルゲン

+0

この問題は解決しましたか? –

答えて

1

は、これが本番でうまくいくかどうかわからテーブルを作成したり、必要に応じて更新し、ないでしょうSystem.Data.Entity.IDatabaseInitializerインターフェイスの独自の実装を作成できる場合

+0

Thxしかし、これは問題を解決しません。一方、ERチームは現在動的モデルに取り組んでいることが分かりました。だから私は忍耐強く、DBを再設計しなければなりません... – Juergen

1

Entity Frameworkはテーブルの動的作成をサポートしていません。したがって、Code-Firstを使用している場合は、対応するテーブルを作成するためにDbContextでDbSetsを定義する必要があります。

http://entityframework.codeplex.com/discussions/448452

この質問

Entity Framework (Code First) - Dynamically Building a Model

のようにそこにいくつかの回避策がありますしかし、EFは、そのための最善のORMはありませんが、(それは軽量ORMです)ServiceStack.OrmLiteを試してみてください。

0
namespace ConsoleApplication31 
{ 
    public class PersonContext : DbContext 
    { 
     public PersonContext() : base("UnicornsCEDatabase") 
     { 
     } 
     public DbSet<Person> Persons { get; set; } 
    } 
    public class Person 
    { 
     public int PersonId { get; set; } 
     public int NameId { get; set; } 
     public string Name { get; set; } 
    } 

    public class Program 
     { 
      static void Main(string[] args) 
      { 
       using (var db = new PersonContext()) 
       { 
        db.Database.Delete(); 

        //Try to create table 
        DbSet per = db.Set<Person>(); 
        var per1 = new Person { NameId = 1, Name = "James" }; 
        per.Add(per1); 
        int recordsAffected = db.SaveChanges(); 

        Console.WriteLine(
         "Saved {0} entities to the database, press any key to exit.", 
         recordsAffected); 
        Console.ReadKey(); 
       } 
      } 
     } 

} 
関連する問題