实体框架关于关系变化的奇怪迁移

我有两个模型


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

        }

迁移尝试重命名现有表,当我运行它时,它给出 errno:2 no such file found 错误。


如果我public List<Employee> Employees { get; set; }从证书模型中删除此行,则不会创建奇怪的迁移。


任何想法为什么会发生这种情况


互换的青春
浏览 125回答 1
1回答

米脂

将集合导航属性添加到现有关系的主体实体通常不会导致迁移,因为数据库关系是通过依赖表中的 FK 列定义的。问题是带有隐式联结表的多对多关系的 EF 映射是不确定的。由于两个涉及的表在关系中具有相同的角色,哪个被认为是“左”或“右”完全取决于 EF 模型依赖顺序算法,并且该算法的唯一要求是确保在创建引用表之前创建依赖表。简而言之,添加导航属性可以改变依赖关系图的顺序,从而在多对多关系的隐式联结表中的左右角色。因此,您不应让 EF 选择它们并始终通过(左)/&nbsp;(右)流式 API 明确指定。HasManyWithMany要保留您的原始设计,请添加以下内容以OnModelCreating覆盖:modelBuilder.Entity<Service>().HasMany(e&nbsp;=>&nbsp;e.Clients).WithMany(e&nbsp;=>&nbsp;e.Services); modelBuilder.Entity<Employee>().HasMany(e&nbsp;=>&nbsp;e.Services).WithMany(e&nbsp;=>&nbsp;e.Employees);
打开App,查看更多内容
随时随地看视频慕课网APP