【问题标题】:Entity Framework: Generating specific table if doesn't exist?实体框架:如果不存在则生成特定表?
【发布时间】:2013-01-10 10:26:28
【问题描述】:

我有一些旧表,我通过逆向工程将它们添加到项目中,以将它们用作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 表。

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

【问题讨论】:

  • 您是说如果表“用户”存在,那么 EF 不会创建您想要的、尚不存在的表(如“配置文件”)?我不确定您所说的“不应操纵哪个表”是什么意思。
  • 是的,这就是我所说的或我看到的,至少。我的最后一句话不正确,对不起。
  • @Blazi,您是将数据库优先与代码优先混合,还是您的项目纯粹是代码优先与数据库同步?
  • 这里是代码优先(我通过实体框架插件从现有数据库创建了代码优先类)。但我也尝试过将代码优先与数据库优先混合。两种方法都没有成功。

标签: asp.net asp.net-mvc entity-framework ef-code-first


【解决方案1】:

你检查过这个答案吗?

EF4 Code First create new table

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

设置初始化策略

在下一节中,我们将开始更改我们的模型,这反过来意味着数据库架构也需要更改。目前没有“开箱即用”的解决方案来发展您现有的模式。数据库演进是我们目前正在进行的工作,最近的设计博客文章中提供了我们前进方向的示例。

但是,在 AppDomain 中第一次使用上下文时,可以运行一些自定义逻辑来初始化数据库。如果您想为测试运行插入种子数据,这很方便,但如果模型已更改,重新创建数据库也很有用。在 CTP5 中,我们包含了一些您可以插入的策略,但您也可以编写自定义策略。

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

using System.Data.Entity.Database;

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

DbDatabase.SetInitializer<ProductContext>(
new DropCreateDatabaseIfModelChanges<ProductContext>());

【讨论】:

  • 谢谢。我正处于我的应用程序的初始阶段,我确实删除了数据库并且它刚刚工作。
【解决方案2】:

我遇到了同样的问题。我使用 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");
   }
}

【讨论】:

  • 这仍然是 2016 年的唯一方法吗?肯定有人找到了在创建新表之前进行检查的好方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多