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

你检查过这个答案吗?

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 回答
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 回答