5

テーブル名は静的ではなく、コンパイル時に認識されるため、実行時に SQLCe データベースにテーブルを追加したいと考えています。次のように、Entity Framework 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();
        }
    }
}

これを実行しようとすると、次のエラーがスローされます: The entity type Person is not part of the model for the current context .

データベースでその DbSet (そのスキーマを含む) を定義することなく、実行時に DbSet を DbContext に追加することは可能ですか?

Person を使用して DbContext を静的に定義すると、EF はデータベース全体とテーブルをその場で作成します。これはすばらしいことです。

例えば:

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

これは何とかEFで可能ですか、それとも他の手法でこれらを作成する必要がありますか?

ありがとう、ユルゲン

4

4 に答える 4

2

以下を使用できます。必要に応じてテーブルを作成または更新しますが、モデルが変更されるとデータベースが削除されるため、これが本番環境で機能するかどうかはわかりません

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

または、System.Data.Entity.IDatabaseInitializer インターフェイスの独自の実装を作成できる場合

于 2011-11-15T15:56:14.990 に答える