在迁移期间不要创建现有表

时间:2015-08-11 17:56:25

标签: c# asp.net-mvc entity-framework model ef-migrations

我使用实体使用代码优先迁移连接到现有数据库。在数据库中,我需要连接到已经存在的几个表并添加一些新表。我以为我已经弄明白但它仍在尝试创建已经存在的表格。以下是其中一个表格的模型:

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

如何阻止它尝试创建现有表并仅映射到它?

1 个答案:

答案 0 :(得分:0)

这是实体框架本身的一个限制,您可以解决此问题。为了使迁移正常运行,它们必须了解整个数据库模式,这意味着它们必须负责整个数据库模式。您无法迁移部分实体,也无法迁移其他实体。

如果您有一个需要使用现有表的用例,那么您应该将它们移到一个单独的数据库并使用两个上下文:一个用于Entity Framework负责的实体,它们将被迁移,并且只是连接到现有数据库,并且已禁用迁移。

从技术上讲,我认为你可以为两个上下文使用相同的数据库,只要你保持实体的正确隔离。然而,这就是问题:当他们在同一个数据库中时,尝试相关实体(外键)太诱人了。如果在迁移上下文中的实体与非迁移上下文中的实体之间创建关系,则迁移上下文实际上也将承担该实体的所有权,并尝试创建该表。然后,你又回到了同一条船上。通过为两个不同的上下文使用两个单独的数据库,您可以放心,没有流血。