0

エンティティ フレームワークでは、モデルを最初に、コードを最初に、データベースを最初に3 つのアプローチを使用できますが、次のステップに進む前に、それぞれ手動で手を加える必要があります (データベースを作成するか、モデルを作成するか、POCO クラス コードまたはエンティティ クラス コードを記述することを意味します)。コンテキストで EF を使用する)。

データベースとテーブル、およびテーブルのリレーションシップをプログラムで作成したいが、EntityFramework 4.3 の機能も必要な場合はどうすればよいでしょうか。

より具体的には、この例http://support.microsoft.com/kb/307283から、SQL コマンドを使用してデータベース、テーブル、およびすべてを作成できますが、エンティティ フレームワークの利点は得られません。では、それが必要な場合はどうすればよいでしょうか。

動的テーブル フィールドを作成できるようにするには、これらの手順では不十分です。3 つのステップすべてのデータベースで、テーブルとテーブルの列は固定されています。ユーザーが新しいテーブルまたは列を動的に作成する方法はありません。http://support.microsoft.com/kb/307283この投稿では、SQL を使用して手動のデータベース、テーブルなどを作成する方法を示していますが、ADO.NET に基づいていますが、Entity Manager でそれを実行したいと考えています。もちろん、それは魔法ではありません。プログラミングが関与している必要があります(プログラミングのアプローチを知りたいです)。

4

3 に答える 3

2

SQL コマンドを使用してデータベースとデータベース オブジェクトを作成する機能が必要だと思います。次に、これらのオブジェクトを EntityFramework コンテキストにマップします。プロジェクトによっては、DBContext から派生した複数のコンテキストがそれぞれ特定の役割を果たしている場合があります。

その場合、SQL を実行する関数を持つ DbContext に Database クラスがあります。コンテキスト オブジェクトでこれらの関数を呼び出すだけです。

MyContext db = new MyContext() 
//Where MyContext :DbContext (MyContext derives from DbContext)

db.Database.ExecuteSqlCommand(sqlcommand, params);
//There are other method in this class like SqlQuery Read documentation.
//The SqlQury is also available on the entities like db.MyEntitySet.SqlQuery(...)

EF コードを既存のデータベースで動作させたい場合は、このブログに従うことができます

コンテキストでデータベース名を使用する場合は、以下のようにコンストラクターで渡すことができます。このようなコンテキストを既存の DB で使用してみることができます。

public class MyContext : DbContext
{
        public MyContext():base("MyDatabase")
        {

        }
     .....
}
于 2012-06-10T08:48:37.550 に答える
0

私はこれについてのアビジットの答えに二番目です。SQL ラインアップ (テーブル、SProcs など) が既に用意されていると想定しています。

EF クエリを作成して作成するには、EF の dbcontext クラスにアクセスするだけです。LINQ でも同様です。

MSDN mag のすばらしい記事は次のとおりです: http://msdn.microsoft.com/en-us/magazine/gg232765.aspx

それが役に立てば幸い!

于 2012-06-10T10:38:41.110 に答える
0

EF の Code First アプローチを使用する場合、DatabaseInitializer の既定の戦略は、「存在しない場合はデータベースを作成する」ことです。したがって、接続文字列に基づいて、DbContext は DB が存在するかどうかを確認します。見つからない場合、EF は必要なスクリプトを実行して、データベース、テーブル、およびリレーションシップを初めて作成します。実行するスクリプトは、モデル (POCO クラスとマッピング構成/データ注釈) に基づいて生成されます。

Customers と Orders という 2 つのテーブルを作成するとします。

public class Customer
{
    public int Id { get;set; }
    public string Name { get;set; }

    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public virtual Customer Customer { get; set; }
    /* ... more fields*/
}

public class MyContext: DbContext
{
    public DbSet<Order> Orders { get; set; }
    public DbSet<Customer> Customers { get; set; }

    public MyContext(): base("MyConnectionString")
    {
    }


}

MyContext クラスをインスタンス化すると、テーブル、フィールド、および外部キー制約が作成されます。

using (var ctx = new MyContext())
{
    /**/
}
于 2012-06-09T21:46:20.250 に答える