WBu*_*uck 3 c# entity-framework-core asp.net-core-2.0
我正在学习如何使用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; }
}
Run Code Online (Sandbox Code Playgroud)
信用卡型号
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; }
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)
语境
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; }
}
Run Code Online (Sandbox Code Playgroud)
启动
public void ConfigureServices( IServiceCollection services )
{
services.AddDbContext<LodgingCrmContext>( options =>
options.UseSqlServer( Configuration.GetConnectionString( "DefaultConnection" ) ) );
}
Run Code Online (Sandbox Code Playgroud)
好,我知道了。
我重新启动VS并导航到,LodgingCrmContext并注意到构造函数已包含Database.EnsureCreated( );在其中。这是我今天早些时候删除的。但是,当我重新启动VS时,它又出现在了ctor中(很奇怪)。
删除Database.EnsureCreated( );并重建后,我最初的创建迁移便开始了。
将Database.EnsureCreated( );是导致要创建两次Customers表。这也将解释为什么创建数据库(使用正确的表)以及为什么看到以下内容:
数据库中已经有一个名为“ Customers”的对象。