1. Generate the initial migration for the following model:
public class User
{
public int Id { get; set; }
public virtual ICollection<Artifact> SubscribedArtifacts { get; set; }
public virtual ICollection<Artifact> AccessibleArtifacts { get; set; }
}
public class Artifact
{
public int Id { get; set; }
public virtual ICollection<User> Subscribers { get; set; }
public virtual ICollection<User> Accessors { get; set; }
}
public class SomeDBContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(t => t.AccessibleArtifacts)
.WithMany(t => t.Accessors)
.Map(m =>
{
m.ToTable("AccessorArtifact");
m.MapLeftKey("AccessorId");
m.MapRightKey("ArtifactId");
});
}
public DbSet<User> Users { get; set; }
public DbSet<Artifact> Artifacts { get; set; }
}
2. Add this to OnModelCreating:
modelBuilder.Entity<User>()
.HasMany(t => t.SubscribedArtifacts)
.WithMany(t => t.Subscribers)
.Map(m =>
{
m.ToTable("SubscriberArtifact");
m.MapLeftKey("SubscriberId");
m.MapRightKey("ArtifactId");
});
3. Generate the second migration
Expected result:
public partial class Second : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts");
DropForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users");
DropIndex("dbo.ArtifactUsers", new[] { "Artifact_Id" });
DropIndex("dbo.ArtifactUsers", new[] { "User_Id" });
CreateTable(
"dbo.SubscriberArtifact",
c => new
{
AccessorId = c.Int(nullable: false),
ArtifactId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.AccessorId, t.ArtifactId })
.ForeignKey("dbo.Users", t => t.AccessorId, cascadeDelete: true)
.ForeignKey("dbo.Artifacts", t => t.ArtifactId, cascadeDelete: true)
.Index(t => t.AccessorId)
.Index(t => t.ArtifactId);
DropTable("dbo.ArtifactUsers");
}
public override void Down()
{
CreateTable(
"dbo.ArtifactUsers",
c => new
{
Artifact_Id = c.Int(nullable: false),
User_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Artifact_Id, t.User_Id });
DropIndex("dbo.SubscriberArtifact", new[] { "ArtifactId" });
DropIndex("dbo.SubscriberArtifact", new[] { "AccessorId" });
DropForeignKey("dbo.SubscriberArtifact", "ArtifactId", "dbo.Artifacts");
DropForeignKey("dbo.SubscriberArtifact", "AccessorId", "dbo.Users");
DropTable("dbo.SubscriberArtifact");
CreateIndex("dbo.ArtifactUsers", "User_Id");
CreateIndex("dbo.ArtifactUsers", "Artifact_Id");
AddForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts", "Id", cascadeDelete: true);
}
}
Actual result:
public partial class Second : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.AccessorArtifact", newName: "SubscriberArtifact");
DropForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts");
DropForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users");
DropForeignKey("dbo.AccessorArtifact", "AccessorId", "dbo.Users");
DropIndex("dbo.ArtifactUsers", new[] { "Artifact_Id" });
DropIndex("dbo.ArtifactUsers", new[] { "User_Id" });
DropIndex("dbo.AccessorArtifact", new[] { "AccessorId" });
CreateTable(
"dbo.AccessorArtifact",
c => new
{
AccessorId = c.Int(nullable: false),
ArtifactId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.AccessorId, t.ArtifactId })
.ForeignKey("dbo.Users", t => t.AccessorId, cascadeDelete: true)
.ForeignKey("dbo.Artifacts", t => t.ArtifactId, cascadeDelete: true)
.Index(t => t.AccessorId)
.Index(t => t.ArtifactId);
AddColumn("dbo.SubscriberArtifact", "SubscriberId", c => c.Int(nullable: false));
DropPrimaryKey("dbo.AccessorArtifact", new[] { "AccessorId", "ArtifactId" });
AddPrimaryKey("dbo.SubscriberArtifact", new[] { "SubscriberId", "ArtifactId" });
AddForeignKey("dbo.SubscriberArtifact", "SubscriberId", "dbo.Users", "Id", cascadeDelete: true);
CreateIndex("dbo.SubscriberArtifact", "SubscriberId");
DropColumn("dbo.SubscriberArtifact", "AccessorId");
DropTable("dbo.ArtifactUsers");
}
public override void Down()
{
CreateTable(
"dbo.ArtifactUsers",
c => new
{
Artifact_Id = c.Int(nullable: false),
User_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Artifact_Id, t.User_Id });
AddColumn("dbo.SubscriberArtifact", "AccessorId", c => c.Int(nullable: false));
DropIndex("dbo.AccessorArtifact", new[] { "ArtifactId" });
DropIndex("dbo.AccessorArtifact", new[] { "AccessorId" });
DropIndex("dbo.SubscriberArtifact", new[] { "SubscriberId" });
DropForeignKey("dbo.AccessorArtifact", "ArtifactId", "dbo.Artifacts");
DropForeignKey("dbo.AccessorArtifact", "AccessorId", "dbo.Users");
DropForeignKey("dbo.SubscriberArtifact", "SubscriberId", "dbo.Users");
DropPrimaryKey("dbo.SubscriberArtifact", new[] { "SubscriberId", "ArtifactId" });
AddPrimaryKey("dbo.AccessorArtifact", new[] { "AccessorId", "ArtifactId" });
DropColumn("dbo.SubscriberArtifact", "SubscriberId");
DropTable("dbo.AccessorArtifact");
CreateIndex("dbo.AccessorArtifact", "AccessorId");
CreateIndex("dbo.ArtifactUsers", "User_Id");
CreateIndex("dbo.ArtifactUsers", "Artifact_Id");
AddForeignKey("dbo.AccessorArtifact", "AccessorId", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts", "Id", cascadeDelete: true);
RenameTable(name: "dbo.SubscriberArtifact", newName: "AccessorArtifact");
}
}
public class User
{
public int Id { get; set; }
public virtual ICollection<Artifact> SubscribedArtifacts { get; set; }
public virtual ICollection<Artifact> AccessibleArtifacts { get; set; }
}
public class Artifact
{
public int Id { get; set; }
public virtual ICollection<User> Subscribers { get; set; }
public virtual ICollection<User> Accessors { get; set; }
}
public class SomeDBContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(t => t.AccessibleArtifacts)
.WithMany(t => t.Accessors)
.Map(m =>
{
m.ToTable("AccessorArtifact");
m.MapLeftKey("AccessorId");
m.MapRightKey("ArtifactId");
});
}
public DbSet<User> Users { get; set; }
public DbSet<Artifact> Artifacts { get; set; }
}
2. Add this to OnModelCreating:
modelBuilder.Entity<User>()
.HasMany(t => t.SubscribedArtifacts)
.WithMany(t => t.Subscribers)
.Map(m =>
{
m.ToTable("SubscriberArtifact");
m.MapLeftKey("SubscriberId");
m.MapRightKey("ArtifactId");
});
3. Generate the second migration
Expected result:
public partial class Second : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts");
DropForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users");
DropIndex("dbo.ArtifactUsers", new[] { "Artifact_Id" });
DropIndex("dbo.ArtifactUsers", new[] { "User_Id" });
CreateTable(
"dbo.SubscriberArtifact",
c => new
{
AccessorId = c.Int(nullable: false),
ArtifactId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.AccessorId, t.ArtifactId })
.ForeignKey("dbo.Users", t => t.AccessorId, cascadeDelete: true)
.ForeignKey("dbo.Artifacts", t => t.ArtifactId, cascadeDelete: true)
.Index(t => t.AccessorId)
.Index(t => t.ArtifactId);
DropTable("dbo.ArtifactUsers");
}
public override void Down()
{
CreateTable(
"dbo.ArtifactUsers",
c => new
{
Artifact_Id = c.Int(nullable: false),
User_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Artifact_Id, t.User_Id });
DropIndex("dbo.SubscriberArtifact", new[] { "ArtifactId" });
DropIndex("dbo.SubscriberArtifact", new[] { "AccessorId" });
DropForeignKey("dbo.SubscriberArtifact", "ArtifactId", "dbo.Artifacts");
DropForeignKey("dbo.SubscriberArtifact", "AccessorId", "dbo.Users");
DropTable("dbo.SubscriberArtifact");
CreateIndex("dbo.ArtifactUsers", "User_Id");
CreateIndex("dbo.ArtifactUsers", "Artifact_Id");
AddForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts", "Id", cascadeDelete: true);
}
}
Actual result:
public partial class Second : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.AccessorArtifact", newName: "SubscriberArtifact");
DropForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts");
DropForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users");
DropForeignKey("dbo.AccessorArtifact", "AccessorId", "dbo.Users");
DropIndex("dbo.ArtifactUsers", new[] { "Artifact_Id" });
DropIndex("dbo.ArtifactUsers", new[] { "User_Id" });
DropIndex("dbo.AccessorArtifact", new[] { "AccessorId" });
CreateTable(
"dbo.AccessorArtifact",
c => new
{
AccessorId = c.Int(nullable: false),
ArtifactId = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.AccessorId, t.ArtifactId })
.ForeignKey("dbo.Users", t => t.AccessorId, cascadeDelete: true)
.ForeignKey("dbo.Artifacts", t => t.ArtifactId, cascadeDelete: true)
.Index(t => t.AccessorId)
.Index(t => t.ArtifactId);
AddColumn("dbo.SubscriberArtifact", "SubscriberId", c => c.Int(nullable: false));
DropPrimaryKey("dbo.AccessorArtifact", new[] { "AccessorId", "ArtifactId" });
AddPrimaryKey("dbo.SubscriberArtifact", new[] { "SubscriberId", "ArtifactId" });
AddForeignKey("dbo.SubscriberArtifact", "SubscriberId", "dbo.Users", "Id", cascadeDelete: true);
CreateIndex("dbo.SubscriberArtifact", "SubscriberId");
DropColumn("dbo.SubscriberArtifact", "AccessorId");
DropTable("dbo.ArtifactUsers");
}
public override void Down()
{
CreateTable(
"dbo.ArtifactUsers",
c => new
{
Artifact_Id = c.Int(nullable: false),
User_Id = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Artifact_Id, t.User_Id });
AddColumn("dbo.SubscriberArtifact", "AccessorId", c => c.Int(nullable: false));
DropIndex("dbo.AccessorArtifact", new[] { "ArtifactId" });
DropIndex("dbo.AccessorArtifact", new[] { "AccessorId" });
DropIndex("dbo.SubscriberArtifact", new[] { "SubscriberId" });
DropForeignKey("dbo.AccessorArtifact", "ArtifactId", "dbo.Artifacts");
DropForeignKey("dbo.AccessorArtifact", "AccessorId", "dbo.Users");
DropForeignKey("dbo.SubscriberArtifact", "SubscriberId", "dbo.Users");
DropPrimaryKey("dbo.SubscriberArtifact", new[] { "SubscriberId", "ArtifactId" });
AddPrimaryKey("dbo.AccessorArtifact", new[] { "AccessorId", "ArtifactId" });
DropColumn("dbo.SubscriberArtifact", "SubscriberId");
DropTable("dbo.AccessorArtifact");
CreateIndex("dbo.AccessorArtifact", "AccessorId");
CreateIndex("dbo.ArtifactUsers", "User_Id");
CreateIndex("dbo.ArtifactUsers", "Artifact_Id");
AddForeignKey("dbo.AccessorArtifact", "AccessorId", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.ArtifactUsers", "User_Id", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.ArtifactUsers", "Artifact_Id", "dbo.Artifacts", "Id", cascadeDelete: true);
RenameTable(name: "dbo.SubscriberArtifact", newName: "AccessorArtifact");
}
}