Entity Framework странная миграция при изменении отношений - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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

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

Любые идеи, почему это происходит

1 Ответ

0 голосов
/ 13 сентября 2018

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

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

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

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

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