Объект уже существует с начальной миграцией Entity Framework Core.

Я изучаю, как использовать EF, и я пытаюсь выполнить первоначальную миграцию создания с использованием ядра EF. Когда я запускаю Update-Database после запуска Add-Migration InitialCreate, я получаю сообщение об ошибке:

В базе данных уже есть объект с именем «Клиенты».

В других вопросах SO, касающихся этой проблемы, обычно человек удалял свою базу данных и выполнял первоначальную миграцию, чтобы решить эту проблему. Поскольку это мое первоначальное создание, я не знаю, как действовать дальше.

У меня нет БД с объектом клиентов, поэтому я не уверен, почему EF сообщает мне, что объект с именем «Клиенты» уже существует при попытке создать мою новую БД.

Теперь, хотя я получаю эту ошибку, кажется, что мои таблицы созданы для новой БД, но я не знаю, в чем причина этой ошибки.

Я удалил новую БД и папку Migrations и попытался запустить те же команды, что и раньше, в консоли.

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

Модель кредитной карты

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

person WBuck    schedule 30.09.2017    source источник


Ответы (1)


Хорошо, я понял это.

Я перезапустил VS и перешел к LodgingCrmContext и заметил, что в конструкторе есть Database.EnsureCreated( );. Это было то, что я удалил ранее сегодня. Но когда я перезапустил VS, он снова был в ctor (странно).

Как только я удалил Database.EnsureCreated( ); и пересобрал, моя первоначальная миграция сработала.

Database.EnsureCreated( ); приводил к тому, что таблица "Клиенты" создавалась дважды. Это также объясняет, почему создается БД (с правильными таблицами) и почему я вижу:

В базе данных уже есть объект с именем «Клиенты».

person WBuck    schedule 30.09.2017