【发布时间】:2018-11-13 17:49:07
【问题描述】:
我有这样的 Configuration 类构造函数:
public Configuration() => AutomaticMigrationsEnabled = false;
我什至将我的 DbContent 更新为:
public DatabaseContext()
: base("DefaultConnection")
{
Database.CommandTimeout = 900;
Database.Log = s => Debug.WriteLine(s);
Configuration.LazyLoadingEnabled = false;
Database.SetInitializer(new CreateDatabaseIfNotExists<DatabaseContext>());
}
但是当我尝试为特定迁移运行 update-database 时:
update-database -TargetMigration CreateOrganisation
我明白了:
应用显式迁移:[201805081508118_CreateOrganisation]。
应用显式迁移:201805081508118_CreateOrganisation。
应用自动迁移:201805081508117_CreateOrganisation_AutomaticMigration。
它运行的最后一个,然后失败,因为它指出:
System.Data.SqlClient.SqlException (0x80131904):数据库中已经有一个名为“Answers”的对象。
有,但实际迁移看起来像这样:
public partial class CreateOrganisation : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Organisations",
c => new
{
Id = c.String(nullable: false, maxLength: 100),
Name = c.String(nullable: false, maxLength: 100),
Description = c.String(maxLength: 255),
})
.PrimaryKey(t => t.Id);
AddColumn("dbo.Users", "OrganisationId", c => c.String(maxLength: 100));
}
public override void Down()
{
DropTable("dbo.Organisations");
DropColumn("dbo.Users", "OrganisationId");
}
}
如您所见,在该迁移中没有提及 Answer,这让我认为它正在尝试进行之前的迁移......
有谁知道我该如何阻止它?
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Table renames
modelBuilder.Entity<Criteria>().ToTable("Criteria");
modelBuilder.Entity<Formula>().ToTable("Formulas");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
modelBuilder.Entity<ImageText>().ToTable("ImageText");
// One to Many
modelBuilder.Entity<Criteria>().HasMany(m => m.Attributes).WithOptional().HasForeignKey(m => m.CriteriaId);
modelBuilder.Entity<IdentityRole>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.RoleId);
modelBuilder.Entity<Organisation>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.OrganisationId);
modelBuilder.Entity<Organisation>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.OrganisationId);
modelBuilder.Entity<Group>().HasMany(m => m.Questions).WithOptional().HasForeignKey(m => m.GroupId);
modelBuilder.Entity<Question>().HasMany(m => m.Answers).WithOptional().HasForeignKey(m => m.QuestionId);
modelBuilder.Entity<Category>().HasMany(m => m.PriorityColours).WithRequired().HasForeignKey(m => m.CategoryId);
modelBuilder.Entity<Category>().HasMany(m => m.Criteria).WithRequired().HasForeignKey(m => m.CategoryId);
modelBuilder.Entity<Category>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.CategoryId);
modelBuilder.Entity<Category>().HasMany(m => m.Quotes).WithRequired().HasForeignKey(m => m.CategoryId);
modelBuilder.Entity<Category>().HasMany(m => m.QuestionGroups).WithRequired().HasForeignKey(m => m.CategoryId);
modelBuilder.Entity<User>().HasMany(m => m.Searches).WithRequired().HasForeignKey(m => m.UserId);
modelBuilder.Entity<User>().HasMany(m => m.Charges).WithRequired().HasForeignKey(m => m.UserId);
modelBuilder.Entity<Answer>().HasMany(m => m.Images).WithRequired().HasForeignKey(m => m.AnswerId);
modelBuilder.Entity<Image>().HasMany(m => m.ImageText).WithRequired().HasForeignKey(m => m.ImageId);
// Create our primary keys
modelBuilder.Entity<IdentityUserLogin>().HasKey(m => m.UserId);
modelBuilder.Entity<IdentityRole>().HasKey(m => m.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(m => new {m.RoleId, m.UserId});
}
根据要求
【问题讨论】:
-
这些答案都不能解决我的问题
-
我们可以看看你的 OnModelCreating 是什么样子的吗?
-
你提到的“重复”不起作用,因为当我尝试创建新的迁移时,它告诉我我还有一些未完成的。我想一一提交,因为他们有一个还不存在的外键。所以我创建了单独的迁移,这样我就可以在添加可空字段之后填充数据,然后再将其转换为外键。
-
你可以试试
-verbose开关看看到底发生了什么。
标签: c# entity-framework