我使用实体使用代码优先迁移连接到现有数据库。在数据库中,我需要连接到已经存在的几个表并添加一些新表。我以为我已经弄明白但它仍在尝试创建已经存在的表格。以下是其中一个表格的模型:
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
如何阻止它尝试创建现有表并仅映射到它?
答案 0 :(得分:0)
这是实体框架本身的一个限制,您可以解决此问题。为了使迁移正常运行,它们必须了解整个数据库模式,这意味着它们必须负责整个数据库模式。您无法迁移部分实体,也无法迁移其他实体。
如果您有一个需要使用现有表的用例,那么您应该将它们移到一个单独的数据库并使用两个上下文:一个用于Entity Framework负责的实体,它们将被迁移,并且只是连接到现有数据库,并且已禁用迁移。
从技术上讲,我认为你可以为两个上下文使用相同的数据库,只要你保持实体的正确隔离。然而,这就是问题:当他们在同一个数据库中时,尝试相关实体(外键)太诱人了。如果在迁移上下文中的实体与非迁移上下文中的实体之间创建关系,则迁移上下文实际上也将承担该实体的所有权,并尝试创建该表。然后,你又回到了同一条船上。通过为两个不同的上下文使用两个单独的数据库,您可以放心,没有流血。