我正在学习如何使用EF,我正在尝试使用EF核心进行初始创建迁移。
运行Update-Database
后运行Add-Migration InitialCreate
时收到错误消息:
数据库中已有一个名为“Customers”的对象。
有关此问题的其他SO问题通常会让此人删除其数据库并执行初始迁移以解决此问题。因为这是我最初的创作,所以我不确定如何继续。
我没有带有客户对象的数据库,因此我不确定为什么EF在尝试创建新数据库时告诉我已经有一个名为“客户”的对象。
现在虽然我收到此错误但是我的表是为新数据库创建的,但我不知道这个错误的原因是什么。
我删除了新的数据库和迁移文件夹,并尝试在控制台中运行与以前相同的命令。
Add-Migration InitialCreate
Update-Database
我仍然收到同样的错误。以下是我的模型,上下文和启动。 任何有关我收到此错误的原因的任何见解都将非常感激。
客户模式
public class Customer
{
[Key]
[DatabaseGenerated( DatabaseGeneratedOption.Identity )]
public int CustomerId { get; set; }
[Required]
[MaxLength( 50 )]
public string FirstName { get; set; }
[MaxLength( 50 )]
public string LastName { get; set; }
[Required]
[EmailAddress]
[MaxLength( 254 )]
public string Email { get; set; }
[Required]
[Phone]
[MaxLength( 15 )]
public string PhoneNumber { get; set; }
public ICollection<LodgingDates> LodgingDates { get; set; } =
new List<LodgingDates>( );
[Required]
public CreditCard CreditCard { get; set; }
[Required]
[MaxLength( 100 )]
public string StreetAddress { get; set; }
[Required]
[MaxLength( 60 )]
public string City { get; set; }
[Required]
[MaxLength( 9 )]
public string PostCode { get; set; }
[Required]
[MaxLength( 55 )]
public string Country { get; set; }
[Required]
[MaxLength( 50 )]
public string StateOrProvince { get; set; }
[Required]
public bool ReceiveEmailNotifications { get; set; }
}
CreditCard模型
public class CreditCard
{
[Key]
[DatabaseGenerated( DatabaseGeneratedOption.Identity )]
public int CreditCardId { get; set; }
[Required]
[MaxLength( 19 )]
[CreditCard]
public string AccountNumber { get; set; }
[Required]
[MaxLength( 4 )]
public int Ccv { get; set; }
[Required]
public DateTime ExpirationDate { get; set; }
[Required]
[MaxLength( 100 )]
public string StreetAddress { get; set; }
[Required]
[MaxLength( 60 )]
public string City { get; set; }
[Required]
[MaxLength( 9 )]
public string PostCode { get; set; }
[Required]
[MaxLength( 55 )]
public string Country { get; set; }
[Required]
[MaxLength( 50 )]
public string StateOrProvince { get; set; }
public Customer Customer { get; set; }
public int CustomerId { get; set; }
}
LodgingDates模型
public class LodgingDates
{
[Key]
[DatabaseGenerated( DatabaseGeneratedOption.Identity )]
public int LodgingDatesId { get; set; }
[Required]
public DateTime CheckInDate { get; set; }
[Required]
public DateTime CheckOutDate { get; set; }
public Customer Customer { get; set; }
public int CustomerId { get; set; }
}
上下文
public sealed class LodgingCrmContext : DbContext
{
public LodgingCrmContext( DbContextOptions<LodgingCrmContext> options )
: base( options )
{
}
public DbSet<Customer> Customers { get; set; }
public DbSet<CreditCard> CreditCards { get; set; }
public DbSet<LodgingDates> LodgingDates { get; set; }
}
启动
public void ConfigureServices( IServiceCollection services )
{
services.AddDbContext<LodgingCrmContext>( options =>
options.UseSqlServer( Configuration.GetConnectionString( "DefaultConnection" ) ) );
}
答案 0 :(得分:5)
好的,我明白了。
我重新启动VS并导航到LodgingCrmContext
并注意到构造函数中包含Database.EnsureCreated( );
。这是我今天早些时候删除的内容。但当我重新启动VS时,它再次出现在ctor中(很奇怪)。
删除Database.EnsureCreated( );
并重建后,我的初始创建迁移工作正常。
Database.EnsureCreated( );
导致Customers表创建两次。这也可以解释为什么要创建数据库(使用正确的表)以及为什么我会看到:
已经有一个名为&#39; Customers&#39;在数据库中。