在不使用键属性而是另一个外键创建导航属性时遇到问题。
public class Operation {
public int Id { get; set; }
public string Name { get; set; }
public int CodeId { get; set; }
public Code Code { get; set; }
public List<Task> Tasks { get; set; }
}
public class Task {
public int Id { get; set; }
public string Name { get; set; }
public int CodeId { get; set; }
public Code Code { get; set; }
public List<Task> Tasks { get; set; }
}
public class Code {
public int Id { get; set; }
public string Name { get; set; }
}
在ModelBuider
里面,我有
modelBuilder.Entity<Operation>().HasKey(g => g.Id);
modelBuilder.Entity<Operation>().HasMany(x => x.Task).WithOne()
.HasForeignKey(x => x.CodeId).HasPrincipalKey(x => x.CodeId);
modelBuilder.Entity<Task>().HasKey(g => g.Id);
modelBuilder.Entity<Code>().HasKey(g => g.Id);
在这里我要进行操作,该操作具有导航属性Tasks
。但是,此导航属性不是通过Task
直接链接到Id
类,而是通过CodeId
链接。因此,基本上,在获取Operation
时,我想Include()
都Tasks
都具有相同的CodeId
。
所以查询部分可以正常工作,但是当我尝试更新Operation
实体时,出现异常:
消息:“实体类型'Operation'的属性'CodeId'是键的一部分,因此不能被修改或标记为已修改。要使用标识的外键更改现有实体的主体,请先删除从属和调用“ SaveChanges”,然后将依赖项与新主体关联。”
有意义的是CodeId
不是实际的密钥或属性。但是,如果我从配置中删除了HasPrincipalKey(x => x.CodeId)
,我将无法正确使用Include()
。
modelBuilder.Entity<Operation>().HasKey(g => g.Id);
modelBuilder.Entity<Operation>().HasMany(x => x.Task).WithOne()
.HasForeignKey(x => x.CodeId).HasPrincipalKey(x => x.CodeId);
那么我该如何使用未通过主外键直接链接的导航属性?