EF6:从隐式迁移到显式的多对多映射表会导致重新创建表

时间:2019-04-15 19:04:50

标签: many-to-many entity-framework-core ef-code-first-mapping

我想从隐式映射表迁移到显式表。

我将从这些课程开始

public class Node
{ 
     [Key]
     public Guid Id {get; set;}

     public virtual HashMap<AspNetUser> AspNetUsers {get; set;} 
}

public class AspNetUser
{ 
    [Key]
    [StringLength(128)]
    public string Id { get; set; }

     public virtual HashMap<Node> Nodes {get; set;} 
}

以及以下代码映射

        modelBuilder.Entity<AspNetUser>()
            .HasMany(e => e.Nodes)
            .WithMany(e => e.AspNetUsers)
            .Map(m => m.ToTable("AccessibleNodes").MapLeftKey("AdminId").MapRightKey("NodeId"));

现在,当我在显式映射表中创建此帮助对象

时,
public class AccessibleNode
{
    public string AdminId { get; set; }

    public Guid NodeId { get; set; }

    public virtual AspNetUser Admin { get; set; }

    public virtual Node Node { get; set; }

}

并按照以下说明修改了我的对象

public class Node
{ 
     [Key]
     public Guid Id {get; set;}

     public virtual HashMap<AccessibleNode> AspNetUsers {get; set;} 
}

public class AspNetUser
{ 
    [Key]
    [StringLength(128)]
    public string Id { get; set; }

     public virtual HashMap<AccessibleNode> Nodes {get; set;} 
}

最后将代码首先更改为映射代码,如下所示

        modelBuilder.Entity<AccessibleNode>()
            .HasKey(x => new { x.AdminId, x.NodeId }).ToTable("AccessibleNodes");

        modelBuilder.Entity<AccessibleNode>()
            .HasRequired(x => x.Admin)
            .WithMany(x => x.Nodes)
            .HasForeignKey(x => x.AdminId).WillCascadeOnDelete();
        modelBuilder.Entity<AccessibleNode>()
            .HasRequired(x => x.Node)
            .WithMany(x => x.AspNetUsers)
            .HasForeignKey(x => x.NodeId).WillCascadeOnDelete();

不幸的是,这种变化似乎引发了迁移。看它生成的脚本,它几乎没有意义

IF object_id(N'[dbo].[FK_dbo.AccessibleNodes_dbo.AspNetUsers_AdminId]', N'F') IS NOT NULL
    ALTER TABLE [dbo].[AccessibleNodes] DROP CONSTRAINT [FK_dbo.AccessibleNodes_dbo.AspNetUsers_AdminId]
IF object_id(N'[dbo].[FK_dbo.AccessibleNodes_dbo.Nodes_NodeId]', N'F') IS NOT NULL
    ALTER TABLE [dbo].[AccessibleNodes] DROP CONSTRAINT [FK_dbo.AccessibleNodes_dbo.Nodes_NodeId]
CREATE TABLE [dbo].[AccessibleNodes] (
    [AdminId] [nvarchar](128) NOT NULL,
    [NodeId] [uniqueidentifier] NOT NULL,
    CONSTRAINT [PK_dbo.AccessibleNodes] PRIMARY KEY ([AdminId], [NodeId])
)
DROP TABLE [dbo].[AccessibleNodes]
ALTER TABLE [dbo].[AccessibleNodes] ADD CONSTRAINT [FK_dbo.AccessibleNodes_dbo.AspNetUsers_AdminId] FOREIGN KEY ([AdminId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE
ALTER TABLE [dbo].[AccessibleNodes] ADD CONSTRAINT [FK_dbo.AccessibleNodes_dbo.Nodes_NodeId] FOREIGN KEY ([NodeId]) REFERENCES [dbo].[Nodes] ([Id]) ON DELETE CASCADE

如您所见,它将删除现有的约束,然后尝试创建已经存在的表,然后尝试删除它并最终恢复约束。这里有两件事:创建然后丢弃?这是没有意义的。在我看来,看着现有的数据库结构,似乎与它试图创建的内容完全相同。所以..我哪里错了?我对另一个对象(也链接到AspNetUser)做了同样的事情,并且它起作用了-唯一的区别是映射表的名称与映射帮助器对象的名称匹配。

0 个答案:

没有答案