实体框架:如果不存在,生成特定的表?

Bla*_*azi 6 asp.net asp.net-mvc entity-framework ef-code-first

我有一些旧表,我通过逆向工程将它们添加到项目中以将它们用作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; }
}
Run Code Online (Sandbox Code Playgroud)

如果我的旧表User存在,那么Entity Framework不会创建其他表,例如Profiletable.

我的问题如果不存在,如何指定应创建哪个

and*_*mka 6

我有同样的问题。我使用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");
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 2016年这仍然是唯一的方法吗?肯定有人找到了一种在创建新表之前进行检查的好方法吗? (9认同)

And*_*son 4

你检查过这个答案吗?

\n

EF4代码首先创建新表

\n

除非您删除并重新创建完整数据库,否则我认为这是不可能的。

\n
\n

设置初始化策略

\n

在下一节中,我们将开始更改模型,这反过来意味着数据库模式也需要更改。目前,没有现成的 \xe2\x80\x98\xe2\x80\x99 解决方案来改进现有架构。数据库演进是我们目前正在研究的事情,最近的设计博客文章中提供了我们前进方向的示例。

\n

然而,第一次在 AppDomain 中使用上下文时,有机会运行一些自定义逻辑来初始化数据库。如果您想插入用于测试运行的种子数据,这很方便,但如果模型已更改,它\xe2\x80\x99s 对于重新创建数据库也很有用。在 CTP5 中,我们提供了一些您可以插入的策略,但您也可以编写自定义策略。

\n

在 Program.cs 顶部添加 System.Data.Entity.Database 的 using 语句

\n
\n
using System.Data.Entity.Database;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

对于本演练,我们只想在模型发生更改时删除并重新创建数据库,因此在我的程序类 I\xe2\x80\x99 中的 Main 方法的顶部添加了以下代码

\n
\n
DbDatabase.SetInitializer<ProductContext>(\nnew DropCreateDatabaseIfModelChanges<ProductContext>());\n
Run Code Online (Sandbox Code Playgroud)\n