实体框架核心初始迁移中对象已存在

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)

WBu*_*uck 7

好,我知道了。

我重新启动VS并导航到,LodgingCrmContext并注意到构造函数已包含Database.EnsureCreated( );在其中。这是我今天早些时候删除的。但是,当我重新启动VS时,它又出现在了ctor中(很奇怪)。

删除Database.EnsureCreated( );并重建后,我最初的创建迁移便开始了。

Database.EnsureCreated( );是导致要创建两次Customers表。这也将解释为什么创建数据库(使用正确的表)以及为什么看到以下内容:

数据库中已经有一个名为“ Customers”的对象。