我有两个模型 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 明确指定。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);
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消