[英]update-database fires: “There is already an object named 'Adresses' in the database”.
I can't get my seed method to run on an alredy existing database. 我无法让自己的种子方法在已经存在的现有数据库上运行。 The database was a result of multiple migrations where we migrated our own created database, "Whitelabel", with the ASP.NET MVC5 Identity database (that we call "IdentityDb"). 该数据库是多次迁移的结果,在该迁移中 ,我们使用ASP.NET MVC5身份数据库(我们称为“ IdentityDb”)迁移了自己创建的数据库“ Whitelabel”。
Here's an overview of the database tables: 这是数据库表的概述:
Since this is made code-first, I used the package manager console to update the database with this command: 由于这是代码优先的,因此我使用包管理器控制台通过以下命令来更新数据库:
PM> update-database -ConfigurationTypeName DAL.DataContexts.WhitelabelMigrations.Configuration
And it fires the error "There is already an object named 'Adresses' in the database". 并引发错误“数据库中已经存在一个名为'Adresses'的对象”。
Here's the WhitelabelDb Context. 这是WhitelabelDb上下文。
using System.Data.Entity;
using ClassLibrary.Entities;
namespace DAL.DataContexts
{
public class WhitelabelDb : DbContext
{
public WhitelabelDb()
: base("WhitelabelDb")
{
}
public virtual DbSet<Category> CategorySet { get; set; }
public virtual DbSet<Product> ProductSet { get; set; }
public virtual DbSet<Stock> StockSet { get; set; }
public virtual DbSet<Rating> RatingSet { get; set; }
public virtual DbSet<Discount> DiscountSet { get; set; }
public virtual DbSet<LineItem> LineItemSet { get; set; }
public virtual DbSet<ShoppingCart> ShoppingCartSet { get; set; }
public virtual DbSet<Invoice> InvoiceSet { get; set; }
public virtual DbSet<Customer> CustomerSet { get; set; }
public virtual DbSet<Adress> AdressSet { get; set; }
}
}
}
And here's the IdentityDb Context: 这是IdentityDb上下文:
using ClassLibrary.Entities;
using Microsoft.AspNet.Identity.EntityFramework;
namespace DAL.DataContexts
{
public class IdentityDb : IdentityDbContext<ApplicationUser>
{
public IdentityDb()
: base("WhitelabelDb")
{
}
}
}
Here's the configuration.cs file for WhitelabelMigrations: 这是WhitelabelMigrations的configuration.cs文件:
using System.Data.Entity.Migrations;
using System;
using System.Collections.ObjectModel;
using System.Data.Entity.Migrations;
using System.Linq;
using ClassLibrary.Entities;
namespace DAL.DataContexts.WhitelabelMigrations
{
internal sealed class Configuration : DbMigrationsConfiguration<WhitelabelDb>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
MigrationsDirectory = @"DataContexts\WhitelabelMigrations";
}
protected override void Seed(WhitelabelDb context)
{
**//This is the seed method I want to run when I update the database:**
if(!context.CategorySet.Any(c => c.Name == "Root"))
{
Category mainCategory = new Category { Id = Guid.NewGuid(), Name = "Root", Parent = null };
context.CategorySet.Add(mainCategory);
context.SaveChanges();
}
}
}
}
And the InitialCreate.cs file for Whitelabel-Migrations using System.Data.Entity.Migrations; 以及使用System.Data.Entity.Migrations的Whitelabel-Migrations的InitialCreate.cs文件;
namespace DAL.DataContexts.WhitelabelMigrations
{
public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Adresses",
c => new
{
Id = c.Guid(false),
Street = c.String(),
ZipCode = c.Int(false),
City = c.String(),
Country = c.String(),
IsShippingAdress = c.Boolean(false),
Customer_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Customers", t => t.Customer_Id)
.Index(t => t.Customer_Id);
CreateTable(
"dbo.Customers",
c => new
{
Id = c.Guid(false),
FirstName = c.String(),
LastName = c.String(),
Email = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Invoices",
c => new
{
Id = c.Guid(false),
DueDate = c.DateTime(false),
InvoiceDate = c.DateTime(false),
Customer_Id = c.Guid(),
ShoppingCart_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Customers", t => t.Customer_Id)
.ForeignKey("dbo.ShoppingCarts", t => t.ShoppingCart_Id)
.Index(t => t.Customer_Id)
.Index(t => t.ShoppingCart_Id);
CreateTable(
"dbo.ShoppingCarts",
c => new
{
Id = c.Guid(false),
Quantity = c.String(),
Status = c.String(),
IsPaid = c.Boolean(false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.LineItems",
c => new
{
Id = c.Guid(false),
Quantity = c.Int(false),
ProductId = c.Guid(),
ShoppingCart_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Products", t => t.ProductId)
.ForeignKey("dbo.ShoppingCarts", t => t.ShoppingCart_Id)
.Index(t => t.ProductId)
.Index(t => t.ShoppingCart_Id);
CreateTable(
"dbo.Products",
c => new
{
Id = c.Guid(false),
Name = c.String(),
Description = c.String(),
Price = c.Decimal(false, 18, 2),
Status = c.String(),
RekeaseDate = c.DateTime(),
Weight = c.Double(),
Category_Id = c.Guid(),
Discount_Id = c.Guid(),
Stock_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Categories", t => t.Category_Id)
.ForeignKey("dbo.Discounts", t => t.Discount_Id)
.ForeignKey("dbo.Stocks", t => t.Stock_Id)
.Index(t => t.Category_Id)
.Index(t => t.Discount_Id)
.Index(t => t.Stock_Id);
CreateTable(
"dbo.Categories",
c => new
{
Id = c.Guid(false),
Name = c.String(),
Parent = c.Guid(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Attributes",
c => new
{
Id = c.Guid(false),
Name = c.String(),
Category_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Categories", t => t.Category_Id)
.Index(t => t.Category_Id);
CreateTable(
"dbo.Discounts",
c => new
{
Id = c.Guid(false),
Price = c.Decimal(precision: 18, scale: 2),
StartDate = c.DateTime(),
EndDate = c.DateTime(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Ratings",
c => new
{
Id = c.Guid(false),
Rate = c.Int(),
Comment = c.String(),
Product_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Products", t => t.Product_Id)
.Index(t => t.Product_Id);
CreateTable(
"dbo.Stocks",
c => new
{
Id = c.Guid(false),
Quantity = c.Int(),
DeliveryDate = c.DateTime(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropForeignKey("dbo.Invoices", "ShoppingCart_Id", "dbo.ShoppingCarts");
DropForeignKey("dbo.LineItems", "ShoppingCart_Id", "dbo.ShoppingCarts");
DropForeignKey("dbo.LineItems", "ProductId", "dbo.Products");
DropForeignKey("dbo.Products", "Stock_Id", "dbo.Stocks");
DropForeignKey("dbo.Ratings", "Product_Id", "dbo.Products");
DropForeignKey("dbo.Products", "Discount_Id", "dbo.Discounts");
DropForeignKey("dbo.Products", "Category_Id", "dbo.Categories");
DropForeignKey("dbo.Attributes", "Category_Id", "dbo.Categories");
DropForeignKey("dbo.Invoices", "Customer_Id", "dbo.Customers");
DropForeignKey("dbo.Adresses", "Customer_Id", "dbo.Customers");
DropIndex("dbo.Invoices", new[] {"ShoppingCart_Id"});
DropIndex("dbo.LineItems", new[] {"ShoppingCart_Id"});
DropIndex("dbo.LineItems", new[] {"ProductId"});
DropIndex("dbo.Products", new[] {"Stock_Id"});
DropIndex("dbo.Ratings", new[] {"Product_Id"});
DropIndex("dbo.Products", new[] {"Discount_Id"});
DropIndex("dbo.Products", new[] {"Category_Id"});
DropIndex("dbo.Attributes", new[] {"Category_Id"});
DropIndex("dbo.Invoices", new[] {"Customer_Id"});
DropIndex("dbo.Adresses", new[] {"Customer_Id"});
DropTable("dbo.Stocks");
DropTable("dbo.Ratings");
DropTable("dbo.Discounts");
DropTable("dbo.Attributes");
DropTable("dbo.Categories");
DropTable("dbo.Products");
DropTable("dbo.LineItems");
DropTable("dbo.ShoppingCarts");
DropTable("dbo.Invoices");
DropTable("dbo.Customers");
DropTable("dbo.Adresses");
}
}
}
And of course the Identity-Migrations InitialCreate.cs 当然还有Identity-Migrations InitialCreate.cs
using System.Data.Entity.Migrations;
namespace DAL.DataContexts.IdentityMigrations
{
public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.AspNetRoles",
c => new
{
Id = c.String(false, 128),
Name = c.String(false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.String(false, 128),
UserName = c.String(),
PasswordHash = c.String(),
SecurityStamp = c.String(),
Discriminator = c.String(false, 128),
Customer_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Customers", t => t.Customer_Id)
.Index(t => t.Customer_Id);
CreateTable(
"dbo.AspNetUserClaims",
c => new
{
Id = c.Int(false, true),
ClaimType = c.String(),
ClaimValue = c.String(),
User_Id = c.String(false, 128),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.AspNetUsers", t => t.User_Id, true)
.Index(t => t.User_Id);
CreateTable(
"dbo.AspNetUserLogins",
c => new
{
UserId = c.String(false, 128),
LoginProvider = c.String(false, 128),
ProviderKey = c.String(false, 128),
})
.PrimaryKey(t => new {t.UserId, t.LoginProvider, t.ProviderKey})
.ForeignKey("dbo.AspNetUsers", t => t.UserId, true)
.Index(t => t.UserId);
CreateTable(
"dbo.AspNetUserRoles",
c => new
{
UserId = c.String(false, 128),
RoleId = c.String(false, 128),
})
.PrimaryKey(t => new {t.UserId, t.RoleId})
.ForeignKey("dbo.AspNetRoles", t => t.RoleId, true)
.ForeignKey("dbo.AspNetUsers", t => t.UserId, true)
.Index(t => t.RoleId)
.Index(t => t.UserId);
CreateTable(
"dbo.Customers",
c => new
{
Id = c.Guid(false),
FirstName = c.String(),
LastName = c.String(),
Email = c.String(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Adresses",
c => new
{
Id = c.Guid(false),
Street = c.String(),
ZipCode = c.Int(false),
City = c.String(),
Country = c.String(),
IsShippingAdress = c.Boolean(false),
Customer_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Customers", t => t.Customer_Id)
.Index(t => t.Customer_Id);
CreateTable(
"dbo.Invoices",
c => new
{
Id = c.Guid(false),
DueDate = c.DateTime(false),
InvoiceDate = c.DateTime(false),
Customer_Id = c.Guid(),
ShoppingCart_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Customers", t => t.Customer_Id)
.ForeignKey("dbo.ShoppingCarts", t => t.ShoppingCart_Id)
.Index(t => t.Customer_Id)
.Index(t => t.ShoppingCart_Id);
CreateTable(
"dbo.ShoppingCarts",
c => new
{
Id = c.Guid(false),
Quantity = c.String(),
Status = c.String(),
IsPaid = c.Boolean(false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.LineItems",
c => new
{
Id = c.Guid(false),
Quantity = c.Int(false),
ProductId = c.Guid(),
ShoppingCart_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Products", t => t.ProductId)
.ForeignKey("dbo.ShoppingCarts", t => t.ShoppingCart_Id)
.Index(t => t.ProductId)
.Index(t => t.ShoppingCart_Id);
CreateTable(
"dbo.Products",
c => new
{
Id = c.Guid(false),
Name = c.String(),
Description = c.String(),
Price = c.Decimal(false, 18, 2),
Status = c.String(),
RekeaseDate = c.DateTime(),
Weight = c.Double(),
Category_Id = c.Guid(),
Discount_Id = c.Guid(),
Stock_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Categories", t => t.Category_Id)
.ForeignKey("dbo.Discounts", t => t.Discount_Id)
.ForeignKey("dbo.Stocks", t => t.Stock_Id)
.Index(t => t.Category_Id)
.Index(t => t.Discount_Id)
.Index(t => t.Stock_Id);
CreateTable(
"dbo.Categories",
c => new
{
Id = c.Guid(false),
Name = c.String(),
Parent = c.Guid(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Attributes",
c => new
{
Id = c.Guid(false),
Name = c.String(),
Category_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Categories", t => t.Category_Id)
.Index(t => t.Category_Id);
CreateTable(
"dbo.Discounts",
c => new
{
Id = c.Guid(false),
Price = c.Decimal(precision: 18, scale: 2),
StartDate = c.DateTime(),
EndDate = c.DateTime(),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Ratings",
c => new
{
Id = c.Guid(false),
Rate = c.Int(),
Comment = c.String(),
Product_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Products", t => t.Product_Id)
.Index(t => t.Product_Id);
CreateTable(
"dbo.Stocks",
c => new
{
Id = c.Guid(false),
Quantity = c.Int(),
DeliveryDate = c.DateTime(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropForeignKey("dbo.AspNetUsers", "Customer_Id", "dbo.Customers");
DropForeignKey("dbo.Invoices", "ShoppingCart_Id", "dbo.ShoppingCarts");
DropForeignKey("dbo.LineItems", "ShoppingCart_Id", "dbo.ShoppingCarts");
DropForeignKey("dbo.LineItems", "ProductId", "dbo.Products");
DropForeignKey("dbo.Products", "Stock_Id", "dbo.Stocks");
DropForeignKey("dbo.Ratings", "Product_Id", "dbo.Products");
DropForeignKey("dbo.Products", "Discount_Id", "dbo.Discounts");
DropForeignKey("dbo.Products", "Category_Id", "dbo.Categories");
DropForeignKey("dbo.Attributes", "Category_Id", "dbo.Categories");
DropForeignKey("dbo.Invoices", "Customer_Id", "dbo.Customers");
DropForeignKey("dbo.Adresses", "Customer_Id", "dbo.Customers");
DropForeignKey("dbo.AspNetUserClaims", "User_Id", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers");
DropForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles");
DropForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers");
DropIndex("dbo.AspNetUsers", new[] {"Customer_Id"});
DropIndex("dbo.Invoices", new[] {"ShoppingCart_Id"});
DropIndex("dbo.LineItems", new[] {"ShoppingCart_Id"});
DropIndex("dbo.LineItems", new[] {"ProductId"});
DropIndex("dbo.Products", new[] {"Stock_Id"});
DropIndex("dbo.Ratings", new[] {"Product_Id"});
DropIndex("dbo.Products", new[] {"Discount_Id"});
DropIndex("dbo.Products", new[] {"Category_Id"});
DropIndex("dbo.Attributes", new[] {"Category_Id"});
DropIndex("dbo.Invoices", new[] {"Customer_Id"});
DropIndex("dbo.Adresses", new[] {"Customer_Id"});
DropIndex("dbo.AspNetUserClaims", new[] {"User_Id"});
DropIndex("dbo.AspNetUserRoles", new[] {"UserId"});
DropIndex("dbo.AspNetUserRoles", new[] {"RoleId"});
DropIndex("dbo.AspNetUserLogins", new[] {"UserId"});
DropTable("dbo.Stocks");
DropTable("dbo.Ratings");
DropTable("dbo.Discounts");
DropTable("dbo.Attributes");
DropTable("dbo.Categories");
DropTable("dbo.Products");
DropTable("dbo.LineItems");
DropTable("dbo.ShoppingCarts");
DropTable("dbo.Invoices");
DropTable("dbo.Adresses");
DropTable("dbo.Customers");
DropTable("dbo.AspNetUserRoles");
DropTable("dbo.AspNetUserLogins");
DropTable("dbo.AspNetUserClaims");
DropTable("dbo.AspNetUsers");
DropTable("dbo.AspNetRoles");
}
}
}
So, how can I get the seed method to run since I only can access the Category class from the Whitelabel configuration.cs file? 那么,由于只能从Whitelabel configuration.cs文件访问Category类,因此如何使seed方法运行?
Any explanations, thoughts and constructive help would be greatly appreciated! 任何解释,想法和建设性的帮助将不胜感激!
Well actually, all I had to do was to add this line in the IdentityDb: 好吧,实际上,我要做的就是在IdentityDb中添加以下行:
public virtual DbSet<Category> CategorySet { get; set; }
The I could access the Category class in the IdentityMigrations configuration.cs and create my Seed method working the way I wanted it to. 我可以访问IdentityMigrations configuration.cs中的Category类,并按照我希望的方式创建我的Seed方法。
protected override void Seed(IdentityDb context)
{
**//This is the seed method I want to run when I update the database:**
if(!context.CategorySet.Any(c => c.Name == "Root"))
{
Category mainCategory = new Category { Id = Guid.NewGuid(), Name = "Root", Parent = null };
context.CategorySet.Add(mainCategory);
context.SaveChanges();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.