Entity framework странная миграция при изменении отношений

У меня две модели

  public class Employee
    {
        public Employee()
        {
            Active = true;
        }

        [Key]
        public long Id { get; set; }

        public List<Service> Services { get; set; }

        public List<SubService> SubServices { get; set; }

        [NotMapped]
        public List<long> ServiceIds { get; set; }

        public bool IsSyncedToSP { get; set; }

        public Certificate Certificate { get; set; }

        [NotMapped]
        public List<long> SubServiceIds { get; set; }

        public List<long> GetServiceIds()
        {
            if (ServiceIds != null && ServiceIds.Count > 0)
            {
                return ServiceIds;
            }
            else if (Services != null && Services.Count > 0)
            {
                return Services.Select(s => s.Id).ToList();
            }
            return new List<long>();
        }

а также

public class Certificate
{
    [Key]
    public long Id { get; set; }

    [Required]
    [UnsyncOnEdit(Unsync = true)]
    public string Title { get; set; }

    public bool IsSyncedToSP { get; set; }

    public List<Employee> Employees { get; set; }
}

Когда я пытаюсь добавить public List<Employee> Employees { get; set; } это отношение к модели сертификата и пытаюсь добавить миграцию, EF создает следующую миграцию

 public partial class empcert2 : DbMigration
    {
        public override void Up()
        {
            RenameTable(name: "dbo.ServiceClients", newName: "ClientServices");
            RenameTable(name: "dbo.EmployeeServices", newName: "ServiceEmployees");
            DropPrimaryKey("dbo.ClientServices");
            DropPrimaryKey("dbo.ServiceEmployees");
            AddPrimaryKey("dbo.ClientServices", new[] { "Client_Id", "Service_Id" });
            AddPrimaryKey("dbo.ServiceEmployees", new[] { "Service_Id", "Employee_Id" });
        }

        public override void Down()
        {
            DropPrimaryKey("dbo.ServiceEmployees");
            DropPrimaryKey("dbo.ClientServices");
            AddPrimaryKey("dbo.ServiceEmployees", new[] { "Employee_Id", "Service_Id" });
            AddPrimaryKey("dbo.ClientServices", new[] { "Service_Id", "Client_Id" });
            RenameTable(name: "dbo.ServiceEmployees", newName: "EmployeeServices");
            RenameTable(name: "dbo.ClientServices", newName: "ServiceClients");
        }
    }

миграция пытается переименовать существующие таблицы, и когда я ее запускаю, она дает errno: 2, ошибка такого файла не найдена.

если я удалю public List<Employee> Employees { get; set; } эту строку из модели сертификата, странная миграция не создается.

Есть идеи, почему это происходит

1
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавление свойства навигации по коллекции к основному объекту существующей связи обычно не должно приводить к миграции, поскольку связь с базой данных определяется через столбец FK в зависимой таблице.

Проблема в том, что отображение EF отношений «многие ко многим» с неявной таблицей соединений не является детерминированным. Поскольку обе задействованные таблицы имеют равные роли в отношениях, то, какая из них считается * левой или правой, полностью зависит от алгоритма порядка зависимостей модели EF, и единственное требование для этого алгоритма - убедиться, что таблицы, на которые есть ссылки, созданы до зависимые таблицы.

Вкратце, добавление свойства навигации может изменить порядок графа зависимостей, таким образом, роли левый и Правильно в неявной таблице соединений для отношений «многие ко многим». Таким образом, вы не должны позволять EF выбирать их и всегда явно указывать это через свободный API HasMany (слева) / WithMany (справа).

Чтобы сохранить исходный дизайн, добавьте в переопределение OnModelCreating следующее:

modelBuilder.Entity<Service>().HasMany(e => e.Clients).WithMany(e => e.Services);
modelBuilder.Entity<Employee>().HasMany(e => e.Services).WithMany(e => e.Employees);

Другие вопросы по теме