11

Code First Entity Framework 4.1 の作業に突然切り替えなければなりませんでした。私はこのフレームワークについて何も知らずに始めましたが、過去 8 時間でブログや記事を読むのがずっと快適になりました。

特にこのブログは、このトピックに関してこれまでに見た中で最高のブログの 1 つですが、与えられた手順は私の経験と一致しません。特に、3 番目と 4 番目のステップ (それぞれ「モデルの作成」と「DbContext コード生成へのスワップ」) にもっと集中する必要があります。定義した EntitySet からデータベースを生成できません。SQL を取得して実行できますが、次のエラーが発生します。

Could not locate entry in sysdatabases for "MyBD" database . No entry found with that name. Make sure that the name is entered correctly entity framework.

SQL を再度実行すると、データベースに既に存在するテーブルの名前の後に同じエラーが表示されます。

サーバー エクスプローラーで DataConnection を更新すると、Entity Framework で定義したようなテーブルは作成されません。

このエラーを取り除き、.edmx でテーブルを正常に生成するにはどうすればよいですか?

また、ソリューション エクスプローラーで右クリックして、DBContext オブジェクトから継承されたコンテキスト クラスを持つ選択したクラス ファイルから "データベースを生成" するオプションを見つけることができません。Microsoft から Entity Framework 4.1 をインストールしたので、そこに表示されるはずです... [データベースの生成] オプションを取得するにはどうすればよいですか?

4

2 に答える 2

8

モデルからデータベースを作成する場合は、最初に空のモデルを選択する必要があります。データベースを作成するその他の手順は次のとおりです。

  1. 新しい接続を選択
  2. サーバー名を設定します。インストールした場合は、単に入力します。デフォルトを選択します。あなたも試すことができます(ローカル)
  3. 新しいデータベース名を設定
  4. DDL スクリプトを SQL サーバー管理スタジオのクエリ画面にコピーします
  5. スクリプトを実行してデータベースを作成します

スクリプトを実行すると、最初のテーブルが作成されます。構成ファイルには、コンテナー名として名前が付けられた接続文字列が含まれます。

これで、TT ファイルの例と同様のコード生成に切り替えたい場合は、右クリックしてコード生成を追加できます。エンティティ モデル用の部分クラスと dbcontext 用の 1 つのファイルが作成されます。これに似ています:

 using System;
    using System.Collections.Generic;

    public partial class Contact
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

コンテキストには 1 つのテーブルしかありません。

 public partial class PersonModelContainer : DbContext
    {
        public PersonModelContainer()
            : base("name=PersonModelContainer")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Contact> Contacts { get; set; }
    }

TT モデルは必要ありません。これらのファイルを直接追加できます。DbContext から継承する 1 つのコンテキスト クラスと、エンティティの種類ごとに 1 つの部分クラス ファイルが必要です。モデルに変更を加えると、EF はそれを検出します。Db 初期化子を定義する必要があります。その Web ページのサンプル デモでは、別のメソッドに初期化子を追加できます。Web プロジェクトの場合、初期開発用にこの init 関数を Global.asax->application_Start に追加します。イニシャライザにはさまざまなオプションがあります。初期開発にはドロップ アンド クリエイトを使用します。

 static void InitDbCheck()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PersonModelContainer>());
            using (var db = new PersonModelContainer())
            {
                //accessing a record will trigger to check db.
                int recordCount = db.Contacts.Count();
            }
        }

        static void Main(string[] args)
        {



            using (var db = new PersonModelContainer())
            {
                // Save some data
                db.Contacts.Add(new Contact { Name = "Bob" });
                db.Contacts.Add(new Contact { Name = "Ted" });
                db.Contacts.Add(new Contact { Name = "Jane" });
                db.SaveChanges();

                // Use LINQ to access data
                var people = from p in db.Contacts
                             orderby p.Name
                             select p;

                Console.WriteLine("All People:");
                foreach (var person in people)
                {
                    Console.WriteLine("- {0}", person.Name);
                }

                // Change someones name
                db.Contacts.First().Name = "Janet";
                db.SaveChanges();
            }
        }
于 2011-09-26T13:31:56.413 に答える