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.
我的问题如果不存在,如何指定应创建哪个表?
我有同样的问题。我使用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)
你检查过这个答案吗?
\n\n除非您删除并重新创建完整数据库,否则我认为这是不可能的。
\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
using System.Data.Entity.Database;\nRun Code Online (Sandbox Code Playgroud)\n\n\n对于本演练,我们只想在模型发生更改时删除并重新创建数据库,因此在我的程序类 I\xe2\x80\x99 中的 Main 方法的顶部添加了以下代码
\n
DbDatabase.SetInitializer<ProductContext>(\nnew DropCreateDatabaseIfModelChanges<ProductContext>());\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
16591 次 |
| 最近记录: |