Entity Framework Core初始迁移已存在对象

时间:2017-09-30 15:33:07

标签: 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; }
 }

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" ) ) );
    }

1 个答案:

答案 0 :(得分:5)

好的,我明白了。

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

删除Database.EnsureCreated( );并重建后,我的初始创建迁移工作正常。

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

  

已经有一个名为&#39; Customers&#39;在数据库中。