我想从隐式映射表迁移到显式表。
我将从这些课程开始
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)做了同样的事情,并且它起作用了-唯一的区别是映射表的名称与映射帮助器对象的名称匹配。