为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
互换的青春 2022-01-16 14:32:14
我有两个模型  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; }从证书模型中删除此行,则不会创建奇怪的迁移。任何想法为什么会发生这种情况
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

将集合导航属性添加到现有关系的主体实体通常不会导致迁移,因为数据库关系是通过依赖表中的 FK 列定义的。

问题是带有隐式联结表的多对多关系的 EF 映射是不确定的。由于两个涉及的表在关系中具有相同的角色,哪个被认为是“左”或“右”完全取决于 EF 模型依赖顺序算法,并且该算法的唯一要求是确保在创建引用表之前创建依赖表。

简而言之,添加导航属性可以改变依赖关系图的顺序,从而在多对多关系的隐式联结表中的左右角色因此,您不应让 EF 选择它们并始终通过(左)/ (右)流式 API 明确指定。HasManyWithMany

要保留您的原始设计,请添加以下内容以OnModelCreating覆盖:

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


查看完整回答
反对 回复 2022-01-16
  • 1 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信