在迁移期间不要创建现有表
本文关键字:创建 迁移 | 更新日期: 2023-09-27 18:07:33
我使用实体连接到使用代码优先迁移的现有数据库。在数据库中,我需要连接到一些已经存在的表,并添加一些新的。我以为我已经弄清楚了,但它仍然试图创建已经存在的表。下面是其中一个表的模型:
namespace PTEManager.Domain
{
public partial class OpsUser
{
public int u_user_id { get; set; }
public Guid DepartmentID { get; set; }
public string email_addr { get; set; }
public string first_nme { get; set; }
public string last_nme { get; set; }
public Guid msrepl_tran_version { get; set; }
public string status { get; set; }
public string user_nme { get; set; }
public int u_branch_id { get; set; }
}
}
下面是我将模型映射到表的地方:
namespace PTEManager.Domain.Mapping
{
class UserMap : EntityTypeConfiguration<OpsUser>
{
public UserMap()
{
// Primary Key
this.HasKey(t => t.u_user_id);
// Properties
this.Property(t => t.DepartmentID);
this.Property(t => t.email_addr)
.IsRequired()
.HasMaxLength(50);
this.Property(t => t.first_nme)
.IsRequired()
.HasMaxLength(30);
this.Property(t => t.last_nme)
.IsRequired()
.HasMaxLength(30);
this.Property(t => t.msrepl_tran_version)
.IsRequired();
this.Property(t => t.status)
.IsRequired()
.HasMaxLength(1);
this.Property(t => t.user_nme)
.IsRequired()
.HasMaxLength(15);
this.Property(t => t.u_branch_id)
.IsRequired();
// Table & Column Mappings
this.ToTable("Users");
this.Property(t => t.u_user_id).HasColumnName("u_user_id");
this.Property(t => t.DepartmentID).HasColumnName("DepartmentID");
this.Property(t => t.email_addr).HasColumnName("email_addr");
this.Property(t => t.first_nme).HasColumnName("first_nme");
this.Property(t => t.last_nme).HasColumnName("last_nme");
this.Property(t => t.msrepl_tran_version).HasColumnName("msrepl_tran_version");
this.Property(t => t.status).HasColumnName("status");
this.Property(t => t.user_nme).HasColumnName("user_nme");
this.Property(t => t.u_branch_id).HasColumnName("u_branch_id");
}
}
}
这是我的dbContext:
namespace PTEManager.Domain.Data
{
public class DataContext : DbContext, IDataContext
{
static DataContext()
{
Database.SetInitializer<DataContext>(null);
}
public DataContext()
: base("OPSPROD")
{
}
///
public DbSet<OpsUser> OpsUsers { get; set; }
public DbSet<Package> Packages { get; set; }
public DbSet<PTEInteractiveCourse> PTEInteractiveCourses { get; set; }
public DbSet<PTETrackingClass> PTETrackingClasses { get; set; }
public DbSet<STCIProductInteractiveInfo> STCIProductInteractiveInfos { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new UserMap());
modelBuilder.Configurations.Add(new PackageMap());
modelBuilder.Configurations.Add(new STCIProductInteractiveInfoMap());
}
}
}
然而,当我添加一个新的迁移时,它仍然会创建这个:
CreateTable(
"dbo.Users",
c => new
{
u_user_id = c.Int(nullable: false, identity: true),
DepartmentID = c.Guid(nullable: false),
email_addr = c.String(nullable: false, maxLength: 50),
first_nme = c.String(nullable: false, maxLength: 30),
last_nme = c.String(nullable: false, maxLength: 30),
msrepl_tran_version = c.Guid(nullable: false),
status = c.String(nullable: false, maxLength: 1),
user_nme = c.String(nullable: false, maxLength: 15),
u_branch_id = c.Int(nullable: false),
})
.PrimaryKey(t => t.u_user_id);
确保我试着运行update-database它告诉我
数据库中已经存在一个名为"Users"的对象。
我在这里找到了映射到现有表的信息:
http://www.codeproject.com/Tips/661053/Entity-Framework-Code-First-Map如何防止它尝试创建现有表并只映射到它?
这是实体框架本身无法解决的限制。为了使迁移正常工作,它们必须了解您的整个数据库模式,这意味着它们必须负责您的整个数据库模式。你不能只迁移部分实体而不迁移其他实体。
如果你有一个需要使用现有表的用例,那么你应该将它们移到一个单独的数据库中,并使用两个上下文:一个用于实体框架负责的实体,它将被迁移,另一个只是连接到你现有的数据库,并禁用迁移。
从技术上讲,我认为您可以为两个上下文中使用相同的数据库,只要您保持实体正确隔离。然而,问题就在这里:当实体(外键)位于同一个数据库中时,尝试使用它们是非常诱人的。如果您在迁移上下文中的实体与非迁移上下文中的实体之间创建关系,那么迁移上下文实际上也会假定该实体的所有权,并尝试创建表。然后,你又回到了同一条船上。通过为两种不同的上下文使用两个独立的数据库,您可以确保没有溢出。