6

として使用するためにリバースエンジニアリングによってプロジェクトに追加した古いテーブルがいくつかありますcode first

このようなもの:

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

public class Profile
{
    [Key, ForeignKey("User")]
    public int  Id { get; set; }
    public string Name { get; set; }

    public virtual User User { get; set; }
}

public class EFDbContext : DbContext
{
    public DbSet<User> Users{ get; set; }
    public DbSet<Profile> Profiles { get; set; }
}

ここで、古いテーブルUserが存在する場合、Entity Framework はテーブルなどの他のテーブルを作成しませんProfile

私の質問存在しない場合に作成するテーブルを指定するにはどうすればよいですか?

4

2 に答える 2

4

私も同じ問題を抱えていました。そして、DbMigration クラスの Sql メソッドを使用して解決しました。このようなもの

 public partial class userToTblUsersMapping : DbMigration
{
    public override void Up()
    {
        this.Sql(@"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tblUsers]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[tblUsers](
[UserID] [varchar](50) NOT NULL,
[UserIDNo] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_tblUsers] PRIMARY KEY CLUSTERED 
([UserID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,            ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
END"
    }
   public override void Down()
   {
      DropTable("dbo.tblUsers");
   }
}
于 2013-09-17T18:09:08.980 に答える
4

この回答を確認しましたか?

EF4コードは最初に新しいテーブルを作成します

完全なデータベースを削除して再作成しない限り、それは不可能だと思います。

初期化戦略の設定

次のセクションでは、モデルの変更を開始します。これは、データベース スキーマも変更する必要があることを意味します。現在、既存のスキーマをその場で進化させるための「すぐに使える」ソリューションはありません。データベースの進化は、私たちが現在取り組んでいるものであり、私たちが向かっている方向のサンプルは、最近のデザイン ブログ投稿で提供されています。

ただし、コンテキストが AppDomain で初めて使用されるときに、カスタム ロジックを実行してデータベースを初期化する機会があります。これは、テスト実行用のシード データを挿入する場合に便利ですが、モデルが変更された場合にデータベースを再作成する場合にも役立ちます。CTP5 には、プラグインできる戦略がいくつか含まれていますが、カスタム戦略を作成することもできます。

Program.cs の先頭に System.Data.Entity.Database の using ステートメントを追加します。

using System.Data.Entity.Database;

チュートリアルでは、モデルが変更されるたびにデータベースを削除して再作成するだけなので、Program クラスの Main メソッドの先頭に次のコードを追加しました。

DbDatabase.SetInitializer<ProductContext>(
new DropCreateDatabaseIfModelChanges<ProductContext>());
于 2013-01-26T18:55:22.963 に答える